Próbuję zrozumieć wykonanie następującego kodu:Zrozumienie wykonanie leniwe realizacji Fibonacciego w Clojure
(def fibs
(concat (lazy-seq [0 1]) (lazy-seq (map + fibs (rest fibs)))))
To co by się spodziewać wykonanie wyglądać
[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 ....
Co jest oczywiście niepoprawne, ponieważ wynik jest nieprawidłowy. Jedynym wykonanie mogłem wymyślić, że produkowane poprawny wynik to:
[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 ....
Czy to jest poprawne „reprezentacja” stanu głowę i ogon w trakcie realizacji? Jeśli tak, dlaczego (rest fibs)
zwraca jeden przedmiot? Czy to z powodu wywołania rekurencyjnego (reszta (reszta [reszta [1 1 2 3])))?