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

时间:2016-02-12 17:58:12

标签: java recursion towers-of-hanoi

我刚刚进入递归,我想我对它是如何工作有基本的了解。我有一个河内塔问题的代码,我一直盯着它看了一个小时试图弄清楚它在做什么。 '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);
    }
  }
}

1 个答案:

答案 0 :(得分:3)

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

因此,它的反向感应。

Eith the Towers,你认为它已经可以随时使用了。因此,要将n磁盘从A移动到B,可以将(n-1)磁盘从A移动到C.现在,最大的磁盘仍在A处,并且在C处整齐排列(n-1)个磁盘。 B是空的。只需将最后一张磁盘从A移动到B,然后将(n-1)磁盘从C移动到B.您已完成。

即使磁盘n-1处于闲置状态,也可以移动n磁盘,因为所有n-1磁盘都小于n,因此可以安全地忽略磁盘n。任何m0 < m < n

都是如此

移动0磁盘更加容易,也不会破坏任何法律。

针对您的具体问题,

  

然后再次减去1再做一次动作?

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

你最后将塔楼交替放在右边的塔上。