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

问题描述:

所以我一直在考虑了以下定义:方案 - 我如何解释这样的输出?

(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”

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

+0

打印'(tail fibs)'的前13个元素。看看你能否找到元素和他们的位置之间的任何对应关系。 – molbdnilo

好,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)逐步取日,然后Ĵķ个,... Ñ个,...从流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], .... 

这就是你看到的。