做一个非常简单的程序来测试递归。程序将打印一些内容,直到数字不大于0。
public class TestIt {
public static void print(int f){
while(f>0){
System.out.println("Not today");
f--;
print(f);
}
}
}
上面的代码是这样从主程序中调用的。
public static void main(String[] args) {
TestIt.print(2);
}
也许我终于失去了理智,但是程序打印的次数超出了我的预期。如果我向该方法发送3,则程序将打印7次。有什么想法吗?
答案 0 :(得分:5)
因为您做错了
while(f>0){
System.out.println("Not today");
f--;
print(f);
}
您正在循环时间内调用方法print
f
由于它是递归的,因此将被递归地称为f-1次
所以它将在世界上出现
删除while
循环,即可根据需要运行
答案 1 :(得分:3)
这是因为每次调用离开堆栈时,f
仍然是原始呼叫,然后继续进行while
循环。因此,对于2
:
while(f>0){
System.out.println("Not today");
f--;
print(f);
}
第一次运行,从2减去,得到1。 (打印计数= 1)递归调用:
再次运行循环时,递归调用:(打印计数= 3)
当循环终止时,退出方法
对于2
,它会打印三遍,但是每传入一个数字,它就会增加。要解决此问题,请执行以下操作:
if(f>0){
System.out.println("Not today");
f--;
print(f);
}
记住递归通常是为了避免循环,因此,如果您发现自己同时使用了两者,这通常是一个危险信号