硕士定理&复发

时间:2017-05-20 17:50:18

标签: math recursion computer-science recurrence master-theorem

我想了解如何解决此代码的主定理:

unsigned long fac (unsigned long n ) {
    if (n == 1 )
        return 1;
    else
        return fact(n-1)*n;
}

所以基于我只有一次自称a = 1的事实。除了那个函数调用之外别无其他,所以O(n)= 1也是如此。现在我正在和我的b挣扎。通常的通用公式是:

T(n)= a * T(n / 2)+ f(n)

在这种情况下,我不分主要问题。新问题必须解决n-1。 现在b是什么?因为我的复发将是:

T(n)= 1 * T(n-1)+ O(1)

我现在如何使用主定理,因为我不知道我的确切b?

2 个答案:

答案 0 :(得分:4)

你可以"作弊"通过使用变量的变化。

T(n) = S(2^n)。然后复发说

S(2^n) = S(2^n/2) + O(1)

我们重写

S(m) = S(m/2) + O(1).

通过a=1, b=2的Master定理,解是对数

S(m) = O(log m),

表示

T(n) = S(2^n) = O(log 2^n) = O(n).

无论如何,使用

直接解决复发问题
T(n) = T(n-1) + O(1) = T(n-2) + O(1) + O(1) = ... = T(0) + O(1) + O(1) + ... O(1) = O(n).

答案 1 :(得分:2)

大师定理不适用于这种特殊的递归关系,但这没关系 - 它不应该适用于所有地方。您最常见的是,Master Theorem以分而治之的方式重现出现,您将输入拆分为与输入原始大小不变的块,并且在这种特殊情况下,这不是正在发生的事情。

要解决此问题,您需要使用其他方法(如迭代方法)或以不同方式查看递归树的形状。