나는 다음과 같은 코드의 실행을 이해하려고 노력 중이 야에 게으른 피보나치 구현의 실행을 이해 :는 Clojure의
(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 [rest] [1 1 2 3]))) 때문입니까?