如果给出了以下递归函数,我将如何为它创建递推方程?
QUIBBLE(n) {
if n = 0 return 1;
else return QUIBBLE(n-1) + QUIBBLE(n-1);
}
我在想它会是:
T(n): 2T(n-1) + 1 when n is >= 1
T(n) = 1 when n is 0,
答案 0 :(得分:1)
通常,良好的启动方法是为某些样本输入写出重复树。
假设n = 3
/* 1 call */ QUIBBLE(3)
/* 2 calls */ = QUIBBLE(2) + QUIBBLE(2)
/* 4 calls */ = QUIBBLE(1) + QUIBBLE(1) + QUIBBLE(1) + QUIBBLE(1)
/* 8 calls */ = QUIBBLE(0) + QUIBBLE(0) + QUIBBLE(0) + QUIBBLE(0) + QUIBBLE(0) + QUIBBLE(0) + QUIBBLE(0) + QUIBBLE(0)
= 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
= 8
通过查看上面的树,我们可以看到,每次调用函数时,树都会分成两个分支。
这也向我们展示了QUIBBLE函数明显呈指数并返回2 ^ n
现在,您的解决方案几乎是正确的。
+ 1
时,您不需要的一件事就是等式的n >= 1
部分。
T(n): 2T(n-1) + 1 when n is >= 1
// ^
// you don't need this
这是一个简单的检查,以了解原因。什么是T(1)
?
根据您的等式,答案是:
T(1) = T(0) + T(0) + 1 = 1 + 1 + 1 = 3
但是,2 ^ 1 == 2
,而不是3
。
因此,答案应该是
T(n): 2T(n-1) when n is >= 1
T(n): 1 when n is 0
答案 1 :(得分:0)
0 =→1 1 =→2 2 =→4 3 => 8 4 => 16
你知道模式吗?QUIBBLE(n)= Math.pow(2,n)
实际上,递推方程是QUIBLE(n)= 2 * QUIBLE(n-1),种子为QUIBLE(0)= 1