方案中的斐波那契序列流

时间:2018-12-02 18:46:41

标签: scheme lisp racket

我目前正在尝试了解方案中流的概念。例如,我应该编写一个函数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传递到输出或随后的流中。

1 个答案:

答案 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)))))