我有一些代码,需要为它编写一个递归关系。代码只计算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)
}
答案 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)。