对于初学者,您的重复需要某种基本情况,否则当您达到 0 时它是未定义的。为简单起见,让我们这么说
T(0) = a
T(1) = a + b
T(n + 2) = T(n) + T(n + 1) + c
让我们开始扩展这个循环的前几个术语:
- T(0) = 一个
- T(1) = a + b
- T(2) = 2a + b + c
- T(3) = 3a + 2b + 2c
- T(4) = 5a + 3b + 4c
- T(5) = 8a + 5b + 7c
- T(6) = 13a + 8b + 12c
- T(7) = 21a + 13b + 20c
这里有一个非常有趣的模式正在形成。让我们分别看一下 a、b 和 c 项的系数。 a项的系数遵循模式
1, 1, 2, 3, 5, 8, 13, 21, ...
这是斐波那契数列,偏移了一步。 b项的系数为
0, 1, 1, 2, 3, 5, 8, 13, ...
这正是斐波那契数列。最后,我们来看看c项:
0, 0, 1, 2, 4, 7, 12, 20, ...
嗯,这看起来并不熟悉。但是,如果我们将其与 a 项放在一起,我们会看到:
a: 1, 1, 2, 3, 5, 8, 13, 21, ...
b: 0, 0, 1, 2, 4, 7, 12, 20, ...
请注意,b 项都是 a 项减去一个!换句话说,就是将斐波那契数列移动了一步,但每一项都减去了 1。
根据这些观察,我们可以推测以下是正确的:
T(n) = aFn+1 + bFn + c(Fn+1 - 1)
我们现在可以尝试通过归纳来证明这一点。作为我们的基本案例:
T(0) = a = 1a + 0b + 0c = 1a + 0b + (1 - 1)c = aF1 + bF0 + c(F 1 - 1)
T(1) = a + b = 1a + 1b + 0c = 1a + 1b + (1 - 1)c = aF2 + bF1 + c (F2 - 1)
对于我们的归纳步骤,假设对于某个自然数 n,
T(n) = aFn+1 + bFn + c(Fn+1 - 1)
还有那个
T(n + 1) = aFn+2 + bFn + 1 + c(Fn+2 - 1)
那么我们就有了
T(n + 2) = T(n) + T(n + 1) + c
= aFn+1 + bFn + c(Fn+1 - 1) + aFn+2 + bFn + 1 + c(Fn+2 - 1) + c
= a(Fn+1 + Fn+2) + b(Fn + Fn+1 ) + c(Fn+1 + Fn+2 - 2 + 1)
= aFn+3 + bFn+2 + c(Fn+3 - 1)
这样就完成了归纳,所以我们的公式一定是正确的!
那么这与效率有何关系?好吧,Binet's formula 告诉我们 Fn = Θ(φn),其中 φ 是 golden ratio(约 1.61)。这意味着
T(n) = aFn+1 + bFn + c(Fn+1 - 1) = aΘ(φ n) + bΘ(φn) + cΘ(φn) = Θ((a + b + c)φn )
所以只要a + b + c ≠ 0,运行时间就是Θ(φn),是指数的。
希望这会有所帮助!