次のコードの実行を理解しようとしています。
(def fibs
(concat (lazy-seq [0 1]) (lazy-seq (map + fibs (rest fibs)))))
これは、実行が次のようになると私が期待するものです
[0 1 : (map + [0 1] [1]) => 1
[0 1 1 : (map + [0 1 1] [1 1]) => 1 2
[0 1 1 1 2 : (map + [0 1 1 2] [1 1 2]) => 1 2 3
[0 1 1 1 2 1 2 3 : (map + [0 1 1 2 3] [1 1 2 3]) => 1 2 3 5
[0 1 1 1 2 1 2 3 1 2 3 5 ....
結果が間違っているので、これは明らかに間違っています。私が思いついた唯一の実行で正しい結果が得られたのは次のとおりです。
[0 1 : (map + [0 1] [1]) => 1
[0 1 1 : (map + [1 1] [1]) => 2
[0 1 1 2 : (map + [1 2] [2]) => 3
[0 1 1 2 3 : (map + [2 3] [3]) => 5
[0 1 1 2 3 5 ....
これは、実行中の頭と尾の状態の正しい「表現」ですか? もしそうなら、なぜ(rest fibs)
単一のアイテムを返すのですか? (rest (rest (rest [1 1 2 3]))) のような再帰呼び出しのためですか?