关于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 );
}
答案 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
。