我知道如果我不使用动态编程,根据递归关系的主方法,复杂度将为O(2 ^ n)。
T(n) = T(n-1) + T(n-2)
。但是,如果我使用动态编程,那么它仍然是O(2 ^ n)?
int [ ] fib = new fib [ 32 ] ;
int fibonacci ( int n) {
if ( n == 1 ) return 1 ;
if ( n == 2 ) return 1 ;
// already calculated fibonacci (n)
if ( fib [ n ] != 0) return fib [ n ] ;
return fib [ n ] = fibonacci ( n−1 ) + fibonacci ( n − 2 ) ;
}
答案 0 :(得分:2)
它只是O(n)
,因为如果已经计算了值,您将立即返回一个值。这意味着,fib(n)
的每个值只会为您拥有的n
计算一次。
答案 1 :(得分:1)
正如dreamzor已经说过的那样,复杂性将是O(n)
,因为如果你用已计算的值调用斐波那契,你就会停止递归。他100%正确。
但是,更有趣的是,fib
函数的调用次数实际上是2*n - 3
的{{1}}。在实验上,验证非常简单:只需添加一个在函数n > 1
中递增的全局变量counter
,然后打印它。
这是因为对于尚未计算的每个fib
,您将进行2次递归调用(n = 1或2除外)。
现在,有点偏离主题但是,轻微的代码重构:
n
另外,我知道您可能正在编写此函数以便学习,但您必须知道迭代形式或尾递归会更好。