4

私はHaskellを学び始めたばかりで、演習として、フィボナッチ数が合計されるプロジェクトオイラー問題に入りました。私の現在の方法はこの関数で、次の要素で新しいリストを作成します。

fib :: (Integral a) => [a] -> [a]
fib xs@(x1:x2:_) = (x1+x2) : xs

結果に関数を再適用する関数を見つけましたiterate。ただし、結果はリストのリストになります[[2,1],[3,2,1],[5,3,2,1],..]iterate中間結果に興味がない場合の代替手段は何ですか?takeWhile最後に生成された番号の条件でを実行したいと思います。これはそれについて完全に考える間違った方法ですか?

(私はフィボナッチ数列を生成するためのより良い/より短い/より良い方法を見てきました、それで私は実際にfib関数に関するフィードバックを探していません-しかし私はそれを機能させたいです、次善の方法かどうか)

4

4 に答える 4

3

使用するだけiterateです!Haskellは純粋な言語であるため、すべてのサブリストが共有され、これらのミニリストをすべて生成するための費用は基本的にかかりません。[2, 1]実際には2, 1in[3, 2, 1]などです。

あなたは本当に必要ではありませんtakeWhile、なぜならそれはあなたにたくさんの余分なガンクを与えるでしょう、そしてあなたはまだリストの最後に。で到達する必要があるでしょうlast。代わりに、を使用してfindください。

また、結果のリストを合計することを計画している場合は、見逃している1ので、1つだけになることに注意してください。

于 2011-05-04T20:58:18.967 に答える
0

連続する各近似は最後の近似よりも1整数正確になるため、「take」を使用します。その後、その上で(head .reverse)を実行できます。

反復している関数に計算可能な固定小数点がない場合、「すべての」結果は中間結果であることに注意してください。

于 2011-05-04T20:33:52.227 に答える
0

の使用法についてはよくわかりませんが、フィボナッチ数のリストをフィルタリングする方法については、Haskellでのフィボナッチ数列のフィルタリングiterateを参照してください。

これは同じ宿題ですか?

于 2011-05-04T20:11:33.737 に答える
0

Haskellで関数が必要な場合は、それを定義するだけです:)

以下は、最もエレガントで慣用的なHaskellではありませんが、必要に応じて末尾再帰ループを使用して、いつでも手作業で物事を実行できることを示すのに役立ちます

apply_n f n x =
    if n = 0 then x
    else apply_n' f (n-1) (f x)

n_th_fib n = apply_n fib n [1,1]

folds(または私が忘れていたライブラリ関数:))を使用してこれを行うためのより良い方法があると確信しています。

于 2011-05-04T21:13:39.587 に答える