因此,我得到了以下定义:
(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“
有人知道怎么解释这件事吗?我不太明白这里到底发生了什么..。
发布于 2017-10-19 21:17:06
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在每次迭代时都取其head元素。这意味着(reorder (stream i j k ... n ...) xs)逐渐接受了_i_th,然后_j_th,_k_th,. _n_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], ....这就是你所看到的。
https://stackoverflow.com/questions/46802194
复制相似问题