我知道Fibonacci系列呈指数增长,因此递归算法具有指数增长的所需步数,但是SICP v2表示树递归Fibonacci算法需要线性空间,因为我们只需要跟踪上面的节点我们在树上。
据我所知,所需的步数与Fib(n)成线性关系,但我也假设因为树呈指数级扩展,所以此事件所需的内存也需要是指数式的。有人可以解释为什么所需的内存只能线性扩展到N,而不是指数级?
答案 0 :(得分:4)
我猜这是在评估中使用应用顺序的结果。鉴于
(define (fib n)
(cond ((= n 0) 0) ((= n 1) 1) (else (+ fib (- n 1)) (fib (- n 2))))))
[来自计算机程序的结构和解释]
(+ (+ (+ (+ (fib 1) (fib 0)) (fib 1)) (+ (fib 1) (fib 0))) (+ (+ (fib 1) (fib 0) (fib 0)))
这将导致树的所有叶子存储在存储器中,这将需要与n指数相关的空间空间。
但是,应用顺序评估应该以不同的方式进行,从一个分支到两个叶子向下驱动到原始表达式,然后提升分支并累积任何侧分支。这将导致(fib 5)的最大长度表达式:
(+ (+ (+ (+ (fib 1) (fib 0)) (fib 1)) (fib 2)) (fib 3))
此表达式比正常顺序评估中使用的表达式短得多。此表达式的长度不受树中叶子数量的影响,只受树的深度影响。
这是我在SICP中盯着这句话的时间超过我承认的时间后的答案。
答案 1 :(得分:2)
您不存储整个树,而只存储与当前深度一样多的堆栈帧。
答案 2 :(得分:-1)
正常顺序评估和应用顺序评估之间的差异类似于深度优先搜索算法和广度优先搜索算法算法之间的差异。
在这个原因中,它是一个正常的顺序评估,所有作为参数的组合将被逐个评估,直到从左到右的顺序不再有任何组合(当组合正在评估时,如果仍有正在评估的组合内部的组合,这些组合中的第一个将在下一次评估之后立即进行评估,并继续这样做。), 这意味着当第一个组合得到评估时,空间将首先展开然后收缩。
继续这样,第二,第三。为整个评估创造最大空间取决于评估过程的深度。
因此,树递归Fibonacci算法需要线性空间。它会帮助