代码:
public static void main(String[] args) {
System.out.println(test(13549));
}
public static int test(int a){
if(a<10)
return a;
int b = (a%10);
int c = test(a/10);
int d = Math.max(b,c);
return d;
}
我理解该方法的作用(在使用调试器之后)并且我理解该方法调用自身直到它小于10并且它运行并检查什么更大,b或c。
现在我不明白的是,为什么当有返回语句return d;
时它返回到int c = test(a/10)
而不是int test(int a){
方法的开头。
答案 0 :(得分:3)
return
语句返回对test
的调用的输出。因此,在第return d;
行,它只是在行test(a/10)
中返回c = test(a/10)
的值。
答案 1 :(得分:1)
这是递归的基本思想 - 当你在自己内部调用方法时,它不仅仅是跳回到方法的开头。
目视:
1
|
| 2
|__|
| | 3
| |__|
| | x
| |__|
| .
| .
其中每条垂直线都是函数的运行,而水平线是递归调用。
每次调用后,它都会返回到调用它的方法实例中的位置 实际上,这意味着在第3次递归中,您在堆栈(内存中)中有3个版本的函数,而不是简单地返回到当前函数的顶部3次。
答案 2 :(得分:0)
在跟踪代码时,假设你有一个堆栈(函数执行)。每当你发现函数正在调用自身时,在堆栈顶部放置一个新函数,当函数返回时取出堆栈元素。
你会发现该函数会一直调用自己,直到达到'基本情况' - 当一个&lt; 10。
将一个代码放在一个return语句下面会没有任何好处(在某种语言中它甚至不会编译),一旦函数返回,代码就不会被执行
答案 3 :(得分:0)
每次调用递归函数时,它都从函数顶部开始。因为你在递归函数调用之后定义了d,所以你永远不会得到d。您将继续递归调用您的函数,直到您能够返回。
答案 4 :(得分:0)
当你致电test(13549)
时会发生这种情况:
test(13549){
false
b=9
c= test(1354){
false
b=4
c=test(135){
false
b=5
c=test(13){
false
b=3
c=test(1){
true
return 1
}
d=Max(3,1)
return 3
}
d=Max(3,3)
return 3
}
d=Max(5,3)
return 5
}
d=Max(4,5)
return 5
}
d=Max(9,5)
return 9
}
很抱歉,如果我可能以任何方式计算错误..但是你可以看到,在所有递归调用完成并且第一个c具有实际值之前,没有达到第一个return语句。