Java 递归方法的大O和大Omega

Java 递归方法的大O和大Omega,java,recursion,big-o,Java,Recursion,Big O,我的任务是试图找到给定Java方法的big-O和big-Omega,但不知道如何找到。我知道big-O给出了上界,big-Omega给出了下界,但是当我看一个程序时,更不用说递归程序了,我该如何准确地理解这个呢? 提前谢谢你,这将对我的学习大有帮助 public static boolean goal(int i, int n){ if(n == 0){ if( i == 91) { System.out.println("i = " + i +"

我的任务是试图找到给定Java方法的big-O和big-Omega,但不知道如何找到。我知道big-O给出了上界,big-Omega给出了下界,但是当我看一个程序时,更不用说递归程序了,我该如何准确地理解这个呢? 提前谢谢你,这将对我的学习大有帮助

public static boolean goal(int i, int n){
    if(n == 0){
        if( i == 91) {
            System.out.println("i = " + i +", DONE!!!");
            return true;
        }
        else {
            return false;
        }

    }
    else if(i % 2 == 1){
        if(goal(i + 53,n - 1))
        {
            System.out.println("i = "+ i + ", step # " + n);
            return true;
        }
        else
            return false;
    }
    else {
       if( goal(i + 53,n - 1) || goal(i / 2,n - 1))
       {
            System.out.println("i = "+ i +", step # " + n);
            return true;
       }
       else
            return false;
    }
}

每次递归迭代,当n减1,递归在n达到0时停止,在最好的情况下,你的i总是奇数,所以你进入第一个分支,所以这个算法的下界是O(n)

上限是最坏的情况,是您最后的
else
分支,当您可以调用
goal
两次时,上限将是O(2^N)

goal(i,N)
在每次调用它时减少
N

最佳案例
i
总是很奇怪。然后,
goal()
每次只进行一次(至少一次)递归调用,您将获得

T(n) = T(n-1) + Ω(1),           T(0) = Ω(1)
T(n) = 2⋅T(n-1) + O(1),         T(0) = O(1)
加起来等于Ω(n)

最坏情况
i
总是偶数。然后
goal()
每次最多进行两次递归调用,得到

T(n) = T(n-1) + Ω(1),           T(0) = Ω(1)
T(n) = 2⋅T(n-1) + O(1),         T(0) = O(1)
这意味着

Σk=0,...,n 2k⋅O(1) = 2n+1⋅O(1) = O(2ⁿ) ∑k=0,…,n 2k⋅O(1)=2n+1⋅O(1)=O(2ⁿ)
注意:这不是很精确。例如,如果
i
为奇数,则在下一次调用中为偶数。如果
i
为偶数且
goal(i+53,n-1)
计算为
true
goal(i/2,n-1)
没有被调用。所以也许我们可以证明更好的上限和下限。

你有教科书吗?99%以上的时间,答案都在教科书中。这就是它的目的。