トラック
/
Elixir
Elixir
/
演習
/
リュカ数
リュカ数

リュカ数

学習演習

はじめに

ストリーム

Enumモジュールの関数は、すべて_即時_に評価されます。Enumモジュールで列挙可能なデータに対して複数の操作をおこなうと、それぞれの操作が中間結果を生成します。

Streamモジュールは、_即時_に評価されるEnumモジュールに代わる_遅延_評価のモジュールです。Enumと同じ関数を数多く提供していますが、中間結果を生成する代わりに一連の計算を組み立て、そのストリームがEnumモジュールの関数に渡されたときに初めて実行します。

ストリームは_Enumerableプロトコル_を実装しており、組み合わせることもできます。ストリームをつなげて、より複雑な機能を作ることができます。

説明

あなたはNumberphileのYouTubeチャンネルの大ファンで、『リュカ数列』についての素敵な動画をちょうど見たところです。この数列をElixirで作ってみたいと思っています。

関数を設計するときは、_遅延評価_を利用して、必要な数の値だけを、必要なときに生成できるようにしたいところです。そこで、ストリームを使うことにしましょう。

1. 不正な引数を弾く

整数以外の値や、1より小さい整数で数列を生成しようとしたときにエラーを発生させるガード節を追加しましょう。これを最初のステップでやっておくと、後のステップで無限再帰のバグを防げます。

LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1

2. 基底ケースを生成する

この数列には、同じルールに従わない2つの開始値があることはわかっていますね。これらの値を返す2つの基底ケースの節を書きましょう。

LucasNumbers.generate(1)
# => [2]

LucasNumbers.generate(2)
# => [2, 1]

3. 一般化したケースを作る

2より長い数列では、前の2つの値を足して次の値を求め、それを繰り返していけばよいことはわかっていますね。一般化したケースを書きましょう。

LucasNumbers.generate(3)
# => [2, 1, 3]

LucasNumbers.generate(4)
# => [2, 1, 3, 4]
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Elixir Exercism

リュカ数を始める準備はできましたか?

Exercismに登録すれば、58個のコンセプト168個の演習、そして本物の人間によるメンタリングとともに、Elixirを学んでマスターできます。すべて無料です。