我刚刚进入递归,我想我对它是如何工作有基本的了解。我有一个河内塔问题的代码,我一直盯着它看了一个小时试图弄清楚它在做什么。 '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);
}
}
}
答案 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
。任何m
,0 < m < n
。
移动0
磁盘更加容易,也不会破坏任何法律。
针对您的具体问题,
然后再次减去1再做一次动作?
不,n
仍然相同,因此(n-1)
在两种情况下都是相同的。
你最后将塔楼交替放在右边的塔上。