为什么带有缓存的优化fibonacci被描述为自上而下的解决方案?

时间:2017-09-24 20:59:08

标签: algorithm recursion dynamic-programming memoization

似乎斐波那契算法的优化版本正在使用memoization 示例:

int cache[N] = {0};  

int fibonacci(int n) {  
  if(cache[n] != 0) return cache[n];    
  if(n ==1 || n == 2) cache[n] = 1;  
  else cache[n] = fibonacci(n - 1) + fibonacci(n - 2);  
  return cache[n];  
}   

这被描述为自上而下的解决方案 但为什么?要查找fibonacci(10),我们需要递归调用所有较低的数字,直到我们达到1并开始构建。所以在我看来,这是一种自下而上的方法 为什么它是最上层的?

2 个答案:

答案 0 :(得分:1)

对于自上而下或自下而上的方法,它没有正式的定义,但通常自上而下的方法是从较大的问题开始,将其细分为更小的方法,并将解决方案与较小的问题结合起来解决原始问题。自下而上的解决方案是一种解决小问题的解决方案,并逐步增加规模,直到您解决整个问题。

上面的功能使用了memoization。由于函数是递归的,它表现出典型的自上而下的模式,从较大的问题开始,将其分成几部分,然后将它们组合起来。并且,由于该函数缓存其结果并且缓存以较小的术语开始并逐渐增长到较大的术语,因此缓存似乎自下而上起作用。

我还没有听说过" top-bottom"之前,但我已经看到许多其他像这样的算法表现出一些自上而下的结构和自下而上的方法。 LR解析就是一个很好的例子 - 它以自下而上的方式工作,使用对最终自上而下结构的理解作为指导。

答案 1 :(得分:0)

它是最高层,因为如果您已经计算了所有其他数字,那么您就依赖它们。 目标位于顶部,您使用其他计算作为底部