所以我得到了以下定义:
index = 10
我被要求显示前7个数字(我将在下面显示)并解释从这行代码输出的数字:
(define head car)
(define (tail stream) (force (cdr stream)))
(define (addL x y)(cons-stream (+ (head x) (head y))(addL (tail x) (tail y))))
(define fibs(cons-stream 1(cons-stream 1
(addL (tail fibs) fibs))))
(define (reorder order-stream data-stream)
(cond ((stream-null? order-stream) the-empty-stream)
((stream-null? data-stream) the-empty-stream)
(else (cons-stream (stream-ref data-stream (stream-first order-stream))
(reorder (stream-rest order-stream) data-stream)))))
结果流的前7个元素的输出是:
“2,3,5,13,55,610,28657”
有没有人有任何想法解释这个?我不太明白这里发生了什么......
答案 0 :(得分:1)
嗯,fibs
是Fibonacci数的无限(懒惰)流,
fibs = 1 , ft ...
ft = 1 , (addL fibs ft) ...
; 1, 1, 2, 3, 5, 8, 13, ....
请允许我在伪代码中写下reorder
的定义,因此更容易理解,因为
(reorder js xs) = empty | if (empty? js) or (empty? xs)
= xs[js[0]] ,
(reorder (rest js) xs) ... | otherwise
请注意,xs
传递未更改,js
在每次迭代时都是其头元素。这意味着(reorder (stream i j k ... n ...) xs)
逐步获取 i ,然后 j th, k th,... n < / em> th,...来自流xs
的元素。
由于调用是(reorder ft ft)
,因此生成的序列为
ft[ft[0]], ft[ft[1]], ft[ft[2]], ...
即
ft[1], ft[2], ft[3], ft[5], ft[8], ft[13], ....
这就是你所看到的。