为方法编写递归关系

时间:2010-09-20 01:02:16

标签: java recursion big-o recurrence relation

我有一些代码,需要为它编写一个递归关系。代码只计算2提升到n次幂。 任何帮助表示赞赏。

public static int two(int n) {

     if (n==0) {
       return 1;
     } else if (n%2 == 0) {
       int x = two(n/2);
       return x*x;
     } else { 
       return 2 * two(n-1)
}

2 个答案:

答案 0 :(得分:1)

函数的表述几乎是递归关系。基本上,您需要做的就是执行变量更改,以便递归中two的参数为n。例如,采用以下Fibonacci函数:

public static int fib(n) {
    if (n==0) {
        return 1;
    } else if (n==1) {
        return 1;
    } else {
        return fib(n-1) + fib(n-2);
    }
}

您不希望使用该实现,因为它的效率非常低,但它使得重现关系的编写变得容易:

fib0=1
fib1=1
fibn+2 = fibn+1 + fibn

使用斐波纳契示例,您实际上不需要执行变量更改。但是,使用two函数,可以更简单地编写关系。

答案 1 :(得分:0)

没有递归调用的行是在一个恒定的时间内完成的,我们将调用c。

T(n)=T(n-1)+c if n is odd.
T(n)=T(n/2)+c if n is even.

每次递归调用n奇数后,下一次递归调用我们用n-1偶数。 所以在最坏的情况下,我们从n odd开始 - > n-1是偶数 - > (n-1)/ 2是奇数 - > (n-1)/ 2-1是偶数等等......

例如,如果我们从n = 19开始,则19是奇数 - > 18是偶数 - > 9是奇数 - > 8是偶数 - > 4是偶数 - > 2是偶数 - > 0

递归树的深度约为lgn,因为在每个级别都有c个操作,那么运行时间是clgn = O(lgn)。