scheme - 我该如何解释这样的输出?
scheme - How do i explain an output like this?
所以我得到了以下定义:
(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)
逐步采取 ith,然后 jth,kth , ... nth, ... 来自流 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], ....
这就是你所看到的。
所以我得到了以下定义:
(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)
逐步采取 ith,然后 jth,kth , ... nth, ... 来自流 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], ....
这就是你所看到的。