java中的基本递归

时间:2012-11-01 08:18:11

标签: java recursion

关于java中递归的两个小问题。

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

如果调用recursiveFunc(150),答案应该是151.有人可以向我解释一下它是如何得到这个答案/它采取了哪些步骤?

假设recursiveFunc2(17),以下函数再次相同,答案是什么以及如何?感谢。

public int recursiveFunc2(int n) {
    if (n == 0)
        return(0);
    else
        return( recursiveFunc2(n/2)+1 );
}

2 个答案:

答案 0 :(得分:3)

如果替换:

return( recursiveFunc(n1) + 1 );

使用:

return recursiveFunc(n - 1) + 1 ;

它按预期工作。

对于第二个功能,它更有趣。想想你可以将17除以2的次数,直到达到0(递归停止条件)?这有点棘手,但分析步骤:

recursiveFunc2(17) = 
recursiveFunc2(8) + 1 = 
recursiveFunc2(4) + 1 + 1 = 
recursiveFunc2(2) + 1 + 1 + 1 = 
recursiveFunc2(1) + 1 + 1 + 1 + 1 = 
recursiveFunc2(0) + 1 + 1 + 1 + 1 + 1 = 
                0 + 1 + 1 + 1 + 1 + 1 = 5

答案 1 :(得分:1)

在分析递归时,您必须检查基本情况以获得最终结果。在此设置中,基本案例是

if (n == 0)
    return(0);

因此,您可以从那里进行逆向工程,然后建立入口案例。在您的示例中,入口是n = 150

基本案例

调用

recursiveFunc(0)。基本案例是n == 0,并返回1

构建

1将返回上一次调用

return recursiveFunc( n - 1 ) + 1;//note that n was 1 to produce a call of 0

因此,recursiveFunc( 1 - 1 )变为1,该行看起来更像

return 1 + 1;

继续

进一步支持,下一个调用将返回2。现在,应该有一个明显的模式。即,

A0 = 1;
A1 = A0 + 1;
A2 = A1 + 1;
...
An = A(n-1) + 1;
...
An = n + 1;

所以这就是你如何得出结论A150 = 151,或更明确地说recursiveFunc(150) == 151