あなたはNumberphileのYouTubeチャンネルの大ファンで、『リュカ数列』についての素敵な動画をちょうど見たところです。この数列をElixirで作ってみたいと思っています。
関数を設計するときは、_遅延評価_を利用して、必要な数の値だけを、必要なときに生成できるようにしたいところです。そこで、ストリームを使うことにしましょう。
整数以外の値や、1より小さい整数で数列を生成しようとしたときにエラーを発生させるガード節を追加しましょう。これを最初のステップでやっておくと、後のステップで無限再帰のバグを防げます。
LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1
この数列には、同じルールに従わない2つの開始値があることはわかっていますね。これらの値を返す2つの基底ケースの節を書きましょう。
LucasNumbers.generate(1)
# => [2]
LucasNumbers.generate(2)
# => [2, 1]
2より長い数列では、前の2つの値を足して次の値を求め、それを繰り返していけばよいことはわかっていますね。一般化したケースを書きましょう。
LucasNumbers.generate(3)
# => [2, 1, 3]
LucasNumbers.generate(4)
# => [2, 1, 3, 4]