我试图弄清楚如何为递归方法确定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))包含什么?
答案 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(看起来你知道怎么做)。