Java 递归输出模糊度

Java 递归输出模糊度,java,Java,我只是在学习递归,有一点我很困惑。 这是密码 public class RecursiveDemo { public static void showRecursion (int num) { System.out.println("Entering method. num = " + num); if (num > 1) { showRecursion(num - 1); } System.out.println("Leaving metho

我只是在学习递归,有一点我很困惑。 这是密码

public class RecursiveDemo {
  public static void showRecursion (int num) {
   System.out.println("Entering method. num = " + num);
    if (num > 1) {
      showRecursion(num - 1);
    }
    System.out.println("Leaving method. num = " + num);
  }

  public static void main(String[] args){
    showRecursion(2);
  }
}
我得到的结果是:

Entering method. num = 2
Entering method. num = 1
Leaving method. num = 1
Leaving method. num = 2

我的问题是为什么我会得到输出“
Leaving method.num=2
”。由于num已经达到1,它不应该停止在“
离开方法.num=1
”吗?

一旦此方法的原始调用离开if语句,它就会传递到
系统.out.println(“离开方法.num=“+num”)。由于您最初使用值
2
调用消息,
2
是这部分代码的
num

您的代码运行方式如下(伪代码):

看起来你对递归有一个基本的误解。 当您使用
(num-1)
作为参数调用方法时,父调用(本例中的第一个调用)将保留值
num
作为其参数,在本例中为
2


main
将调用
showRecursion(2)
,然后调用
showRecursion(1)
(因此您会收到两条“输入”消息)。此时,条件将失败,因此不再发生递归。因此,现在程序只需依次从每个函数调用返回,打印两条“离开”消息。

这是因为对
showRecursion(2)
的初始调用尚未完成。

所以让我们注释掉下面的一行

//showRecursion(num - 1);
你会得到什么?一定是

 Entering method. num = 2
 Leaving method. num = 2

如果你取消上面这行的注释。你应该得到你拥有的那一个。

考虑以下几点:

public static void showFirstRecursion (int num) {
  System.out.println("Entering method. num = " + num);
  if (num > 1) {
    showSecondRecursion(num - 1);
  }
  System.out.println("Leaving method. num = " + num);
}

public static void showSecondRecursion (int num) {
  System.out.println("Entering method. num = " + num);
  if (num > 1) {
    showThirdRecursion(num - 1);
  }
  System.out.println("Leaving method. num = " + num);
}

// I won't bother showing an implementation for showThirdRecursion, because it won't be called.

public static void main(String[] args){
  showFirstRecursion(2);
}
没问题,对吧?您希望看到输入的第一个方法、第二个输入的方法(第三个不输入,因为num==0)、第二个左、第一个左


递归真的没有什么特别之处。它只是进行一个函数调用,恰好调用了该调用所属的函数。从概念上讲,递归调用在所有方面的行为都与任何其他函数调用类似。诀窍是设计一个递归算法,也就是说,提出一个你想调用你已经在使用的同一个函数的原因。

其他答案已经涵盖了这个特定的问题,但是有一些关于使用调试器的信息。本教程是针对Eclipse的,但基本上告诉了您对于任何可视化调试器都需要了解的内容

基本知识非常简单,至少花时间学习如何逐步完成代码是值得的。调试器是快速验证程序逻辑的无价工具,它比将打印语句分散到各处要容易得多。

试试“showRecursion(5);”

[答:这是递归。内存中有多个变量“num”的副本。“num”是一个参数;它不是字段,也不是静态的。]

所以我理解的是 每个方法调用都会填充堆栈,即2,1
但是当i>1不匹配时,它返回/中断调用,并控制system.out.println行,该行打印从堆栈顶部开始的值ie 1,2

是否尝试在调试器中单步执行代码?+1作为家庭作业标记。很抱歉问这个问题,但我完全不知道如何使用调试器。我该如何使用它?调试器?我只是把print语句放在各处,但是如果2是num的值,它不应该回到if语句中吗?我已经更新了我的答案。让我知道这是否为你澄清了一切。哦,好的。现在我明白了。它打印2的原因是,即使进行了第二次呼叫,第一次呼叫仍处于活动状态,对吗?是的!当第二次调用结束时,它会继续。好的,我明白你在说什么,但是当我注释掉上面的行时,我得到了输出:Leaving方法。num=1离开方法。num=2。现在我明白了为什么我得到了“leaving method num=1”,但我不明白为什么我得到了“leaving method.num=2”,因为num已经减少到了1,这是因为在num减少后,这意味着调用showRecursion(1)后,系统仍然需要根据您的代码做一些事情:system.out.println(“leaving method.num=“+2”);谢谢你的详细解释。它澄清了我关于递归的大部分问题。请尝试阅读本文,以便更好地理解这里的问题/答案。你的贡献并没有回答这个问题。这更多的是一种评论,一旦你提高了声誉,你可以添加:
public static void showFirstRecursion (int num) {
  System.out.println("Entering method. num = " + num);
  if (num > 1) {
    showSecondRecursion(num - 1);
  }
  System.out.println("Leaving method. num = " + num);
}

public static void showSecondRecursion (int num) {
  System.out.println("Entering method. num = " + num);
  if (num > 1) {
    showThirdRecursion(num - 1);
  }
  System.out.println("Leaving method. num = " + num);
}

// I won't bother showing an implementation for showThirdRecursion, because it won't be called.

public static void main(String[] args){
  showFirstRecursion(2);
}