2017-04-23 3 views
1

私はハスケルには新しく、この2つの機能の違いは何か不思議でした。これらの2つのHaskell関数フィボナッチ関数の違いは何ですか?

fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 

fib1 = 1 :1 : [a+b | (a,b) <- zip fib1 (tail fib1)] 

私は彼らがより明確にどのように働いているか知っています。次のように私は現在、それらを理解する方法

は次のとおりです。

私はzipWithは、最初の関数で2人の、この場合のリスト「のFIB」と「テールのFIB」に追加機能を適用することを知っています。しかし、私は再帰がどのように働いているのか混乱しています。私はフィックスがリストを返し、テールフィックスはリストの先頭を除いてすべてであることを知っています。しかし、私は中間的なステップとzipWithがこの再帰的にどのように働いているのか混乱していると思います。

fib1では、私は上記の "zip"と同じ質問がありますが、 "a"と "b"にどのように正確に適用されているのでしょうか?なぜタプルに "a"と "b"があるのですか?

もっと明確ではないと申し訳ありません。私は人々が何を持っていることは、リストにフィボナッチ数列を作成する無限再帰で、第一の機能では、事前

+0

'fib1'に関して:' zip'は 'zipWith(、)'と同じです(もっと冗長に 'zipWith(\ a b->(a、b))'です。 – duplode

答えて

0

感謝を提供できる任意の助けに感謝します。テールは、シーケンス内の次の要素を参照するために使用され、それらの2つを一緒に追加します。私は、第三の要素の作成をトレースすることにより、あなたは何が起こっているかをよりよく理解と思う:

zipWith (+) fibs (tail fibs) -> 
zipWith (+) (0 : 1 : zipWith (+) fibs (tail fibs)) (1 : zipWith (+) fibs (tail fibs)) -> 
(0 + 1 : 1 + zipWith (+) fibs (tail fibs) : ...) 

あなたはのFIBリスト内の各要素は順番にその2人の元の番号を追加することによって作成されていることがわかります。

fib1でも同様のことが起こっています。シーケンス内の隣り合う2つのタプルをグループ化し、リストがその2つのタプルの合計であることを宣言します(何が起きているのかをよりよく理解するために、上記のように "解決"できます)。タプル自体は重要ではなく、データを渡すための単なる方法であることに注意してください。リストやユーザー定義型でも同じ効果を得ることができます。

何かが明確でない場合は教えてください。 乾杯します。

関連する問題