了解Clojure中惰性fibonacci实现的执行
我试图理解以下代码的执行:了解Clojure中惰性fibonacci实现的执行,clojure,lazy-evaluation,lazy-sequences,Clojure,Lazy Evaluation,Lazy Sequences,我试图理解以下代码的执行: (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 : (ma
(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 2 3]))?Fibs是(0 1…
(因为(concat[0 1]…)
)<代码>(rest fibs)是(1…
)。然后(map+fibs(rest-fibs))
((+ 0 1) ...) => (1 ...)
所以fibs是(01…
。既然我们得到了下一项,我们可以计算出另一项:
(1 (+ 1 1) ...) => (1 2 ...)
而且它还在继续
(1 2 (+ 1 2) ...)
把fibs想象成它已经存在,把(map+fibs(rest-fibs)
的状态想象成在已经存在的fibs列表上移动(这很好,因为它最终会计算出我们需要的一切)
写下这两个序列也会有所帮助:
(0 1 1 2 3 5 ...)
+(1 1 2 3 5 ...)
=(1 2 3 5 8 ...)
(我会在这里画箭头来表示我们已经得到了什么以及结果如何,但我在这里做得不太好)