因此,我们遇到了经典的河内问题,我只是进入了这个递归过程,而且有点麻烦了!
它可以正常运行,但是我不明白它可能是什么!据我了解,对于任何n,它将打印“从+”到“ +直通”,这将在每次n接近1时发生。有人会认为在n = 1时,代码将停止,但是我得到了“直通+”的打印输出,转到“ +到”(最后打印输出)。如果n = 1是终止条件,那么我怎么可能免费获得代码的最后一部分?

我还希望代码至少在每次迭代时都执行最后的打印输出,但是没有!另外,此示例始终包含两个递归调用,但是仅使用一个就可以了!这到底是怎么回事?此代码如何逐步执行?我是否误解了有关递归方法的一些基本事实? (在Eclipse编译器上编译)。

 public static void hanoi(char from, char to, char thru, int n) {
if (n==1) {
  System.out.println(from + " going to " + to);
}  else {
  System.out.println (from + " going to " + thru);
  hanoi(from, to, thru, n-1);
  System.out.println (thru + " going to " + to);
}
  }

最佳答案

我是否误解了有关递归方法的一些基本事实?


听起来像你有。您似乎有一种印象,即使您多次调用该方法,该方法也只会退出一次。实际上,每次您到达此行:

System.out.println (from + " going to " + thru); <-- this line
hanoi(from, to, thru, n-1);
System.out.println (thru + " going to " + to);


...您还必须在递归调用完成后的某个时候点击下一行:

System.out.println (from + " going to " + thru);
hanoi(from, to, thru, n-1);
System.out.println (thru + " going to " + to);   <-- this line


在不进行附加递归调用的意义上,n == 1是“终止条件”。但是,您的“ if”语句中仍包含代码:

if (n==1) {
  System.out.println(from + " going to " + to);
}


该代码将作为最终条件的一部分运行,但不会再次调用hanoi方法。但是,这只是递归调用的结尾。在此之前,每次互相调用hanoi时,堆栈上仍然有一个方法调用,这些方法调用需要完成。

  System.out.println (from + " going to " + thru);
  hanoi(from, to, thru, n-1);   <-- if `n-1` here was `1`, you'd still have to
                                    complete the following line.
  System.out.println (thru + " going to " + to);

10-08 19:34