给出以下功能
int g(int y) {
if (y <= 0) {
return 1;
}
else {
return g(y-1) + g(y-2) + g(y-3);
}
}
我们需要找到T(n)
运行时间。现在,我知道你可以写
T(n) = T(n-1) + T(n-2) + T(n-3) + 1
我不确定您是否可以进一步简化此操作,例如T(n) = 3T(n-1) + 1
?
答案 0 :(得分:7)
设 S(n)= T(n)+ 1/2 ,然后 S(n)= S(n-1)+ S(n-2)+ S(的n-3)强>
然后 T(n)应 c 1 x 1 n + c 2 x 2 n + c 3 x 3 n - 1/2 ,其中 x i 是等式的根 x 3 - x 2 - x - 1 = 0 和 c i 是特定系数。
T(n)的准确解决方案有点复杂。实际上 x 1 = 1.84,x 2 ,x 3 = -0.42±0.61i (是的,它们是不是真实的数字)。
但是,如果 T(n)可以简化为 T(n)= 3T(n-1)+ 1 ,那么 T( n)必须像 c 1 x n + c 0 。因此,您无法进一步简化它。
答案 1 :(得分:2)
您的功能不是
T(n) = T(n-1) + T(n-2) + T(n-3) + 1
是
if n > 2
T(n) = T(n-1) + T(n-2) + T(n-3)
or
T(n) = 1, 3, 5 for n = 0, 1, 2 respectively.
要检查,请使用以下“y”
运行原始功能g(0) = 1
g(1) = 3
g(2) = 5
g(3) = 9 (i.e. = g(0) + g(1) + g(2) = 9, not g(1) + g(2) + g(3) + 1 = 10)
使用动态编程避免重新计算已计算的T(n)s
int g(int y)
{
if(y <= 0)
return 1;
if(y == 1)
return 3;
if(y == 2)
return 5;
int a1 = 1; int a2 = 3; int a3 = 5;
int ret = 1;
for(int i = 2; i < y; ++i)
{
ret = a1 + a2 + a3;
a1 = a2;
a2 = a3;
a3 = ret;
}
return ret;
}