确定递归方法的大O.

时间:2013-06-16 19:59:57

标签: java recursion big-o

我试图弄清楚如何为递归方法确定Big O表示法。我意识到这可能与迭代方法的方式相同,但我不确定这一点。

我编写了这个简单的递归Java程序:

public RecursiveFunctions() {
recursiveFunction1(2);
}

// Meget simpel rekursiv metode der taeller en Integer ned 
public void recursiveFunction1(int someInteger) {
    System.out.println("Tallet er nu : " + someInteger);
    someInteger = someInteger * 2;
    if (someInteger < 100) {
        recursiveFunction1(someInteger);            
    }
}

我不确定这一点,但我的猜测是这是O(n)还是O(1)符号? 另外,O(n ^ 2)或O(log(n))包含什么?

3 个答案:

答案 0 :(得分:4)

根据你对此的看法,它是O(1),因为对于正输入它总是最多需要7次迭代,你可以说它将是O(lg n),因为所需的迭代次数将相对改变到输入的lg基数2,或者它是未定义的,因为非正输入的计算永远不会完成。随便挑选!

答案 1 :(得分:1)

您必须确定基本案例的成本(函数C(n))和递归调用的成本。例如,对于阶乘函数:

unsigned int factorial(unsigned int n)
{
    if(n < 2) //This is O(1), so not affect to the result (We could think as its a constant 'a')
        return 1; //As the comparison, think its a constant 'b', so C(0) and C(1) = b + a;
    else
        return n * factorial(n-1); //The multiplication (O(1), a constant 'c') and the call C(n-1), so C(n) = c + a + C(n-1)
}

现在,展开一组值的函数C(n),以找到进展:

C(0) = a + b
C(1) = a + b
C(2) = (c+a) + C(1) = (c+a) + a + b
C(3) = (c+a) + C(2) = (c+a) + (c+a) + C(1) = (c+a) + (c+a) + a + b
C(4) = (c+a) + C(3) = (c+a) + (c+a) + C(2) = (c+a) + (c+a) + (c+a) + C(1) = (c+a) + (c+a) + c + a + b
C(5) = (c+a) + C(4) = (c+a) + (c+a) + C(3) = (c+a) + (c+a) + (c+a) + C(2) = (c+a)  + (c+a) + (c+a) + (c+a) + C(1) = (c+a) + (c+a) + (c+a) + (c+a) + a + b
...
C(n) = (n-1)*(c+a) + a + b --> O(n)

但是认为大O只有大n的意思,而不是小数字,就像你的代码一样(你的代码至少有七次调用,相当于O(1))。

答案 2 :(得分:0)

一般来说,找到递归方法的渐近增长可能非常复杂,但通常可以使用Master theorem来解决此任务。

你的例子太简单了。它可以很容易地转换为具有几乎相同性能的迭代函数。然后你可以找到迭代方法的Big-O(看起来你知道怎么做)。