方案 - 我如何解释这样的输出?

时间:2017-10-18 03:11:23

标签: stream scheme racket lazy-evaluation fibonacci

所以我得到了以下定义:

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”

有没有人有任何想法解释这个?我不太明白这里发生了什么......

1 个答案:

答案 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], ....

这就是你所看到的。