我知道那里有很多递归教程,但我需要确保我的思维过程是正确的。
1+1=2
0+1=1
1+10=11
2+10=12
或
2
1
1+10 = 11
2+10 = 12
根据代码,哪一个是正确的思考?
public class recTest {
//public static int v = 0;
public static void main(String[] args) {
System.out.println(test(2));
//(System.out.println("---");
//System.out.println(v);
}
public static int test (int n) {
if (n == 0)
return 10;
else
System.out.println(n);
return test(n-1) + 1;
}
}
答案 0 :(得分:1)
第二个选项,因为它首先执行此操作:
System.out.println(n);
然后调用递归方法。
所以,第一次,它只会打印输入参数:2
。
答案 1 :(得分:1)
据我所知,两者都不正确。
由于println的位置,第二个更正确,但1 + 10和2 + 10不准确,因为你永远不会添加2到10。
当你致电test(2)
时,你真的在递归通话中返回的11中加1。
你更准确地说:
test(2) -> test(1) + 1 -> 11 + 1 -> 12
test(1) -> test(0) + 1 -> 10 + 1 -> 11
test(0) -> 10 -> 10
或者,如果我们通过扩展将其写出来,它将看起来像:
test(2)
= test(1) + 1
= (test(0) + 1) + 1
= (10 + 1) + 1
= (11) + 1
= 12
答案 2 :(得分:1)
正如我在评论中所说的那样,我不会想到诸如正确的思维和#34;之类的东西。但这是我希望有用的方式:
main calls test(2)
> test(n=2) prints 2
> test(n=2) calls test(1) to compute test(n-1) + 1
> > test(n=1) prints 1
> > test(n=1) calls test(0) to compute test(n-1) + 1
> > > test(n=0) returns 10
> > test(n=1) uses 10 for test(0)
> > test(n=1) computes test(0) + 1 = 10 + 1 = 11
> > test(n=1) returns 11
> test(n=2) uses 11 for test(1)
> test(n=2) computes test(1) + 1 = 11 + 1 = 12
> test(n=2) returns 12
main uses 12 for test(2)
main prints 12
有点冗长,但你可以保留任何有助于你思考的部分。但请注意,正如Trevor所说,它并不能直接在任何地方计算10 + 2。当然,从数学角度来看,它也是一样的,因为+具有交换和关联属性,这意味着你添加一堆东西的顺序并不重要。
答案 3 :(得分:0)
我同意@ThingyWotsit,但只是为了给你提供一个简单的参考,过程将是这样的(数学伪代码):
sysout(test(2));
// test(2) prints: 2
sysout(test(1) + 1);
// test(1) prints: 1
sysout(test(0) + 1 + 1);
sysout(10 + 1 + 1);
sysout(12);
// prints: 12
你应该深入研究调用堆栈原理。