您可以在这里使用的一个技巧是根据另一个变量重写递归。假设您写 n = 2 k。然后递归简化为
T(2 k ) = T(2 k-3 ) + T(2 k-2 ) + T(2 k-1 )。
让我们让 S(k) = T(2 k )。这意味着您可以将此递归重写为
S(k) = S(k-3) + S(k-2) + S(k-1)。
为简单起见,我们假设基本情况是 S(0) = S(1) = S(2) = 1。鉴于此,您可以使用多种方法来解决此重复问题。例如,歼灭者方法(链接的第 5 节)在这里解决此递归非常好,因为它是线性递归。如果你在这里使用歼灭者方法,你就会明白
S(k) - S(k - 1) - S(k - 2) - S(k - 3) = 0
S(k+3) - S(k+2) - S(k+1) - S(k) = 0
(E 3 - E 2 - E - 1)S(k) = 0
如果你找到方程 E 3 - E 2 - E - 1 的根,那么你可以将递归的解写成这些根的 k 次幂的线性组合。在这种情况下,结果证明递归类似于 Tribonacci 数,如果你解决所有问题,你会发现递归求解为 O(1.83929 k ) 形式的东西。
现在,既然你知道 2 k = n,我们就知道 k = lg n。因此,递归求解为 O(1.83929 lg n )。让我们让 a = 1.83929。那么解的形式为 O(a lg n ) = O(a (log a n) / log a 2) ) = O(n 1/log a 2 )。这大约为 O(n 0.87914... )。您的 O(n lg 3 ) = O(n 1.584962501... )的初始上限明显弱于这个上限。
希望这可以帮助!