Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Clojure中惰性fibonacci实现的执行_Clojure_Lazy Evaluation_Lazy Sequences - Fatal编程技术网

了解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 ...)
(我会在这里画箭头来表示我们已经得到了什么以及结果如何,但我在这里做得不太好)