4

フィボナッチ数列の n 番目の数までのリストを返す haskell を使用した割り当ての助けが必要です。

お気に入り

Main> fib 5
[0,1,1,2,3,5]
Main> fib 15
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610]

これは分かります

fib::Int->Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

しかし、n 番目の数値までのすべての値を含むリストを作成する方法がわかりません。

ありがとうございました

4

1 に答える 1

14

それを行うためのクールな方法がいくつかありますが、最初は最も簡単な方法です

fib::Int->Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
fibList n = map fib [1..n]

または、これを1つにマージできます

fib::Int->[Int]
fib 0 = [0]
fib 1 = [1, 0]
fib n = (head (fib (n-1)) + head (fib (n-2))) : fib (n-1)

ここでは、リスト構築と再帰を組み合わせているだけです。今、私たちはクレイジーへの一歩を踏み出します

fib n = take n fiblist
  where fiblist = 0:1:(zipWith (+) fiblist (tail fiblist))

fiblistこれはフィボナッチ数の無限リストです。私たちがしているのは、適切な量をつかむことだけです。これは、Haskell が「怠惰」であるため可能です。Haskell を初めて使用する場合は、微笑んでうなずいてください。

最後に、キックと笑いのために

fib = flip take . fix $ \f -> 0 : 1 : (zipWith (+) f (tail f))

これは、点がなく、再帰の代わりに固定小数点があることを除いて、上記と同じです。

繰り返しになりますが、あなたが haskell を初めて使用する場合、最初の 2 つは理解するのが少し簡単です。数週間後に最後の 2 に戻ってきてください :)

于 2013-04-15T11:51:04.393 に答える