scheme - 我该如何解释这样的输出?

scheme - How do i explain an output like this?

所以我得到了以下定义:

(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 个数字(我将在下面显示)并解释从这行代码输出的那些数字:

(reorder (tail fibs) (tail fibs))

结果流的前 7 个元素的输出是:

"2、3、5、13、55、610、28657"

有人对此有任何解释吗?我不太明白这里到底发生了什么......

嗯,fibs 是斐波那契数列的无限(惰性)流,

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) 逐步采取 ith,然后 jth,kth , ... nth, ... 来自流 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], ....

这就是你所看到的。