基本上,递归函数的工作方式如下:
T(函数)= T(递归部分)+ T(其余部分)
对吗?
因此在此代码中:
int foo(int n){
printf("%d",n);
if(n>0){
foo(n-1);
foo(n-1);
}
return 0;
}
为此,递归方程为:T(n)= 2 * T(n-1)+ 2 * C,还是T(n)= 2 * T(n)+ C?我知道这对整体时间复杂度没有影响,但要求概念清晰,因为递归函数被调用两次,而O(1)分别被调用两次,因此在每个级别上,常量调用不会增加一倍,因此是2 * c,对吗? 现在在创建递归树时,递归部分求值为O(2 ^ n),常数1为O(n ^ 2),因此, T(n)= O(2 ^ n)+ O(n ^ 2)= O(2 ^ n),对吧?
现在,让我们在另一个函数中说:
int foo(int n){
int temp = n;
while(--temp>=0) printf("%d",n);
if(n>0){
foo(n-1);
}
return 0;
}
在这里,T(n)= T(n-1)+ n
递归部分的计算结果为O(n),常数部分的计算结果为O(n ^ 2),因此总体时间复杂度为O(n ^ 2),对吧?
我的理解正确吗?递归函数的时间复杂度=递归调用的总成本+不变部分的总成本
说
T(n) = 2*T(n-1) + O(1); n>1
O(1) & terminate; n = 1
在这里,如果最初n = 3,那么得出递归调用的总成本为6 * O(1)且以不变为单位的总成本为7 * O(1)是否正确?
通常,当T(n)分解为T(n / something)时,我可以应用Mater定理,但是在诸如T(n-something)这样的问题中,这是不适用的,因此我绘制了一个递归树并将它们加起来,有没有更简单的方法来解决此类问题?