我目前正在尝试了解方案中流的概念。例如,我应该编写一个函数fibonacci
,该函数返回斐波那契数字作为流的表示形式。
该函数所需的输出/用法如下:
> (define a (finbonacci))
> a
((0 0) . #<promise>)
> (tail a)
((1 1) . #<promise>)
> (tail (tail a))
((2 1) . #<promise>)
因此每个流元素代表一对n fib(n)
。
流是这样预定义的:
(define the-empty-stream '())
(define-syntax cons-stream
(syntax-rules ()
((cons-stream x y)
(cons x (delay y)))))
(define head car)
(define (tail s) (force (cdr s)))
(define empty-stream? null?)
我目前最基本的解决方案是:
(define fibo
(cons-stream 1
(cons-stream 1
(map + fibo (tail fibo))))))
但是即使这将计算任何内容,我也不知道如何将n
传递到输出或随后的流中。
答案 0 :(得分:2)
您在正确的道路上。唯一需要调整的是递归定义的精确表示。
考虑以下内容(其中---表示我们要添加):
1 1 2 3 5 8 ... fib
1 2 3 5 8 13 ... (stream-rest fib)
------------------ ---------------------------------
2 3 5 8 13 21 ... (stream-rest (stream-rest fib))
请注意,(stream-rest (stream-rest fib))
是fib
和(stream-rest fib)
的总和。
这意味着我们可以将fib
定义为:
(define fib (stream-cons 1 (stream-cons 1 (stream-add fib (stream-rest fib)))))