方案 - 我如何解释这样的输出?
问题描述:
所以我一直在考虑了以下定义:方案 - 我如何解释这样的输出?
(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)
逐步取我日,然后Ĵ日ķ个,... Ñ个,...从流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], ....
这就是你看到的。
打印'(tail fibs)'的前13个元素。看看你能否找到元素和他们的位置之间的任何对应关系。 – molbdnilo