Java 需要解释我的河内塔递归代码是如何工作的吗

Java 需要解释我的河内塔递归代码是如何工作的吗,java,recursion,towers-of-hanoi,Java,Recursion,Towers Of Hanoi,我刚刚开始学习递归,我想我对它的工作原理有了基本的了解。我有河内塔问题的代码,我盯着它看了一个小时,试图弄清楚它到底在做什么。“moveDisks”方法让我感到困惑。我希望有人能帮我解释一下这个方法的原理。不是我写的 为了尝试理解,我运行了代码,并将磁盘数设为2。以下是打印出来的内容: 行动包括: 将磁盘1从A移到C, 将磁盘2从A移到B, 将磁盘1从C移到B 如果我理解正确的话,2把我们带到'else'块,这意味着2-1将从A移动到C,然后再减去1进行另一个移动?我不明白接下来会发生什么,也不

我刚刚开始学习递归,我想我对它的工作原理有了基本的了解。我有河内塔问题的代码,我盯着它看了一个小时,试图弄清楚它到底在做什么。“moveDisks”方法让我感到困惑。我希望有人能帮我解释一下这个方法的原理。不是我写的

为了尝试理解,我运行了代码,并将磁盘数设为2。以下是打印出来的内容:

行动包括: 将磁盘1从A移到C, 将磁盘2从A移到B, 将磁盘1从C移到B

如果我理解正确的话,2把我们带到'else'块,这意味着2-1将从A移动到C,然后再减去1进行另一个移动?我不明白接下来会发生什么,也不明白为什么需要更换塔楼

import java.util.Scanner; 

public class TowersOfHanoi {
  /** Main method */
  public static void main(String[] args) {
    // Create a Scanner
    Scanner input = new Scanner(System.in);
    System.out.print("Enter number of disks: ");
    int n = input.nextInt();

    // Find the solution recursively
    System.out.println("The moves are:");
    moveDisks(n, 'A', 'B', 'C');
  }

  /** The method for finding the solution to move n disks
      from fromTower to toTower with auxTower */

  public static void moveDisks(int n, char fromTower,
      char toTower, char auxTower) {
    if (n == 1) // Stopping condition
      System.out.println("Move disk " + n + " from " +
        fromTower + " to " + toTower);
    else {
      moveDisks(n - 1, fromTower, auxTower, toTower);
      System.out.println("Move disk " + n + " from " +
        fromTower + " to " + toTower);
      moveDisks(n - 1, auxTower, toTower, fromTower);
    }
  }
}

递归是信仰的飞跃。关键是,你不需要试图控制每一个小细节。您只需假设您已经编写了函数,并且它工作正常。然后你用它。就这些

所以,它是反向的归纳法

即使是塔楼,你也认为它已经在你的掌控之中。因此,要将
n
磁盘从A移动到B,您需要将
(n-1)
磁盘从A移动到C。现在,最大的磁盘仍然位于A,并且排列整齐的
(n-1)
磁盘位于C。B是空的。只需将最后一张磁盘从A移到B,然后将
(n-1)
磁盘从C移到B。就完成了

移动
n-1
磁盘是可以的,即使磁盘
n
在周围,因为所有
n-1
磁盘都小于
n
,因此可以安全地忽略磁盘
n
。对于任何
m
0
,也是如此

移动
0
磁盘更容易,也不会违反任何规则


针对你的具体问题,

然后再减去1再移动一步

否,
n
仍然是相同的,因此
(n-1)
在两种情况下都是相同的


你将塔楼交替,最终落在右边。

递归是信仰的飞跃。关键是,你不需要试图控制每一个小细节。您只需假设您已经编写了函数,并且它工作正常。然后你用它。就这些

所以,它是反向的归纳法

即使是塔楼,你也认为它已经在你的掌控之中。因此,要将
n
磁盘从A移动到B,您需要将
(n-1)
磁盘从A移动到C。现在,最大的磁盘仍然位于A,并且排列整齐的
(n-1)
磁盘位于C。B是空的。只需将最后一张磁盘从A移到B,然后将
(n-1)
磁盘从C移到B。就完成了

移动
n-1
磁盘是可以的,即使磁盘
n
在周围,因为所有
n-1
磁盘都小于
n
,因此可以安全地忽略磁盘
n
。对于任何
m
0
,也是如此

移动
0
磁盘更容易,也不会违反任何规则


针对你的具体问题,

然后再减去1再移动一步

否,
n
仍然是相同的,因此
(n-1)
在两种情况下都是相同的


您可以交替使用两个塔,最终到达正确的塔。

使用调试器逐步完成您的程序,并变得开明;使用调试器逐步完成您的程序,并变得开明;使用调试器逐步完成您的程序,并变得开明;使用调试器逐步完成您的程序,并变得开明;这是解释递归的一个很好的方法。@Chap有帮助。:)这是解释递归的好方法。@Chap很高兴能帮上忙。:)