2012-11-16 3 views
6

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

답변

6

Fibs는 (0 1 ...)입니다 (처음에는 (concat [0 1] ...)이기 때문에). (rest fibs)(1 ...)입니다. 그런 다음 (map + fibs (rest fibs))

((+ 0 1) ...) => (1 ...) 

그래서 FIB를가 (0 1 1 ...)입니다.

(1 (+ 1 1) ...) => (1 2 ...) 

을 그리고 계속 ... FIB를

(1 2 (+ 1 2) ...) 

생각해을 있이 것처럼, 그리고 국가 : 우리는 다음 항목을 가지고 있기 때문에, 우리는 또 다른 하나 계산할 수 있습니다 (map + fibs (rest fibs)은 이미 존재하는 fib의 목록에서 움직입니다 (괜찮 았기 때문에 결국 우리가 필요한 모든 것을 계산할 수있게되었습니다). 또한 단지 두 시퀀스를 적어 도움이 될 수

:

(0 1 1 2 3 5 ...) 
+(1 1 2 3 5 ...) 
=(1 2 3 5 8 ...) 

(나는 결과가 어디로 가는지 여기에 화살표가 우리가 이미 가지고 무엇을 표시하고 그릴 것입니다,하지만 난 할 수 없어 여기에 잘).