2017-10-18 71 views
1

所以我一直在考慮了以下定義:方案 - 我如何解釋這樣的輸出?

(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

回答

1

好,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], .... 

這就是你看到的。