Math 主定理;复发

Math 主定理;复发,math,recursion,computer-science,recurrence,master-theorem,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是什么?因

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

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,我现在怎么能使用主定理呢?

主定理不适用于这种特殊的递推关系,但没关系——它不应该适用于任何地方。最常见的是,主定理出现在分治式的重复出现中,将输入分割成块,这些块是输入原始大小的常量部分,而在这种特殊情况下,情况并非如此


要解决此递归,您需要使用另一种方法,如迭代法或以不同的方式查看递归树的形状。

主定理不适用于此特定的递归关系,但这没关系-它不应该适用于任何地方。最常见的是,主定理出现在分治式的重复出现中,将输入分割成块,这些块是输入原始大小的常量部分,而在这种特殊情况下,情况并非如此

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

您可以使用变量更改来“欺骗”

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的主定理,解是对数的

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).
你可以通过改变变量来“作弊”

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的主定理,解是对数的

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).

真聪明!出于好奇,在做这个把戏时,你不需要比主定理通常提供的更精确的对数基数,因为常数因子会转化为多项式指数的差吗?@templatetypedef:我留下了一个隐式的基数是2,但这并不重要,因为O符号有一个隐藏因子。在任何情况下,行为都是线性的。这很聪明!出于好奇,在做这个把戏时,你不需要比主定理通常提供的更精确的对数基数,因为常数因子会转化为多项式指数的差吗?@templatetypedef:我留下了一个隐式的基数是2,但这并不重要,因为O符号有一个隐藏因子。在任何情况下,行为都是线性的。