java-为什么此递归方法超出我的预期

时间:2018-12-12 01:04:09

标签: java recursion

做一个非常简单的程序来测试递归。程序将打印一些内容,直到数字不大于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次。有什么想法吗?

2 个答案:

答案 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)递归调用:

    • 再次减去0,递归调用:(打印计数2)
      • 从不输入循环。返回:
    • 0,不执行循环时,返回:
  • 再次运行循环时,递归调用:(打印计数= 3)

    • 传递零,未输入循环时返回
  • 当循环终止时,退出方法

对于2,它会打印三遍,但是每传入一个数字,它就会增加。要解决此问题,请执行以下操作:

if(f>0){
    System.out.println("Not today");
    f--;
    print(f);
}

记住递归通常是为了避免循环,因此,如果您发现自己同时使用了两者,这通常是一个危险信号