关系的时间复杂度T(n)= nT(n-1)+ n 在我的编程像这样
f(int n)
{
c++;
if(n>0)
for(i=1;i<=n;i++)
f(n-1);
}
我拿了一个计数器来计算调用多少时间函数 它给出了n到n之间的答案! 感谢。
答案 0 :(得分:1)
您的代码缺少递归的+n
部分,因此我假设代码错误并且递归
T(n) = n*T(n-1) + n
是对的。
让f(n)=T(n)/n!
,然后
f(n) = T(n)/n! = n(T(n-1)+1)/n!
= T(n-1)/(n-1)! + 1/(n-1)!
= f(n-1) + 1/(n-1)!
= sum(1,n-1, 1/k!)
~ e
因此T(n) ~ e*n!
。
答案 1 :(得分:-1)
该功能称为
n*f(n-1)
次。用这个定义替换f(n-1)
给出了
n*((n-1)*f(n-2)
再次更换:
n*((n-1)*((n-2)*f(n-3)))
删除括号:
n*(n-1)*(n-2)*...(1)
这给出了:
n= 3: 3*2*1 = 6
n= 4: 4*3*2*1 = 24
n= 5: 5*4*3*2*1 = 120
是n!
。
答案 2 :(得分:-1)
我们可以列出几个术语
T(0) = 0
T(1) = 1 * 0 + 1
T(2) = 2 * 1 + 2 = 4
T(3) = 3 * 4 + 3 = 15
T(4) = 4 * 15 + 4 = 64
...
我们可以注意到一些事情。首先,函数的增长速度比n!它开始小于它(在n = 0),赶上(在n = 1)并超过它(在n> = 2)。所以我们知道下限是n!。
现在,我们需要上限。我们可以注意到一件事:T(n)= nT(n-1)+ n&lt;对于所有足够大的n(n> = 2,我认为),nT(n-1)+ nT(n-1)。但我们可以很容易地证明T(n)= nT(n-1)是n!的递归关系,因此我们知道T(n)= nT(n-1)+ nT(n-1)的递归关系)= 2nT(n-1)是(n!)(2 ^ n)。我们可以做得更好吗?
我建议我们可以。我们可以证明对于任何c> 0,T(n)= nT(n-1)+ n <0。对于足够大的n值,nT(n-1)+ cnT(n-1)。我们已经知道T(n-1)的下限是(n-1)!所以,如果我们采取c = n /(n-1)!我们确切地恢复了我们的表达式,我们知道上限是(c ^ n)(n!)。当n变为无穷大时,c的极限是多少? 0. [n /(n-1)!] ^ n?
假设的最大值是多少祝你好运计算。 Wolfram Alpha非常清楚地表明,对于n~2.5,此函数假设的最大值约为5或6。假设你确信这是什么,那么它是什么?
N! &LT; T(n)&lt; 〜6N!对于所有人N!是你的复发的Theta-bound。