许多解决方案在线上。大多声称非优化的“memo-proc”序列版本的“fib”序列与计算非存储器的常规“fib”函数相同。跟踪非优化的“memo-proc”版本的加法时,我看到了另一个故事。
设A(n)为执行(stream-ref fibs n)的加法次数。
- A(0)=0 - A(1)=0 - A(2)=1 - A(3)=3 - A(4)=7 - A(5)=14 - A(6)=26
使用替换和非优化(未存储器化的流)的函数定义,我可以看到这些加法是什么,为什么会发生但我很难想出一个好的方程来回答问题,实际上它是呈指数级增长的。
例如,对于A(4),跟踪的添加如下:
- 1+0 - 1+0 - 1+1 - 1+0 - 1+1 - 1+0 - 2+1
以下是一些伪代码,用于显示
(stream-ref fibs 4)
的替换,其中“。”表示中缀流-cons,"{e}"代表承诺执行"e":(cddddr fibs)
(cddr (add-streams (cdr fibs) fibs))
(cddr (stream-map + (cdr fibs) fibs)))
(cddr ((+ 1 0) . {stream-map + (cddr fibs) (cdr fibs)}))
(cdr (stream-map + (cddr fibs) (cdr fibs)))
(cdr (stream-map + ((+ 1 0) . {stream-map + (cddr fibs (cdr fibs)}) (cdr fibs))
(cdr (+ 1 1) . {stream-map + (stream-map + (cddr fibs) (cdr fibs)) (cddr fibs)})
(stream-map + (stream-map + (cddr fibs) (cdr fibs)) (cddr fibs))
(stream-map + (stream-map + ((+ 1 0) . {stream-map + (cddr fibs) (cdr fibs)}) (cdr fibs)) (cddr fibs)
(stream-map + (stream-map + ((+ 1 0) . {stream-map + (cddr fibs) (cdr fibs)}) (1 . {stream-map + (cdr fibs) fibs)})) (cddr fibs))
(stream-map + ((+ 1 1) . {stream-map + (stream-map + (cddr fibs) (cdr fibs)) (stream-map + (cdr fibs) fibs)}) ((+ 1 0) . {stream-map + (cddr fibs) (cdr fibs)})
(+ 2 1) . {stream-map + (stream-map + (stream-map + (cddr fibs) (cdr fibs)) (stream-map + (cdr fibs) fibs))) (stream-map + (cddr fibs) (cdr fibs))}
以下是实际的 Racket 代码:
#lang racket
(define-syntax-rule (delay f) (lambda () f))
(define (force f) (f))
(define stream-null? null?)
(define the-empty-stream '())
(define-syntax-rule (cons-stream a b)
(cons a (delay b)))
(define stream-car car)
(define (stream-cdr stream) (force (cdr stream)))
(define (add-streams s1 s2)
(define (add x y)
(begin
(display "Adding ")
(display x)
(display " + ")
(display y)
(newline)
(+ x y)))
(stream-map add s1 s2))
(define (stream-map proc . argstreams)
(if (stream-null? (car argstreams))
the-empty-stream
(cons-stream
(apply proc (map stream-car argstreams))
(apply stream-map
(cons proc
(map stream-cdr
argstreams))))))
(define (stream-ref s n)
(if (= n 0)
(stream-car s)
(stream-ref (stream-cdr s) (- n 1))))
(define fibs
(cons-stream
0 (cons-stream
1 (add-streams
(stream-cdr fibs) fibs))))
(stream-ref fibs 4)
大部分在线答案都说类似于 a(n) = a(n - 1) + a(n - 2) + 1
。
delay
没有被记忆化时的答案。我想我回答了错误的问题... - user5920214