用递归解决问题
汉诺塔是根据一个传说形成的数学问题:
有三座塔A,B,C。开始时A塔上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。每次只能将一个圆盘从一座塔移动至另一座塔,且不能将圆盘放在任何比它小的圆盘上。如何将所有圆盘移至C塔?
解决传统的汉诺塔问题时一般会应用递归的思想。
当N=1时,只要把它从A塔移至C塔便宣告完成。当N>1时,可将这个问题分为三步:
- 将全部N-1个盘子从A塔移至B塔;
- 将第N个盘子从A塔移至C塔;
- 将全部N-1个盘子从B塔移至C塔。
当考虑如何将全部N-1个盘子从A塔移至B塔时,可以依照上面的思路如法炮制。只不过此时应当将B塔与C塔对调。最终,我们可以把这个问题简化为数个简单的步骤。
import java.util.Scanner; public class Hanoi { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("盘子个数: "); int n = input.nextInt(); System.out.println("解法:"); moveDisks(n, "起始", "中间", "目标"); } static int count = 0; public static void moveDisks(int n, String fromTower, String auxTower, String toTower) { if (n == 1) { count++; System.out.println("第 " + count +" 步: 将 " + n + " 号盘从" + fromTower + "塔移至" + toTower + "塔"); } else { count++; moveDisks(n - 1, fromTower, toTower, auxTower); System.out.println("第 " + count +" 步: 将 " + n + " 号盘从" + fromTower + "塔移至" + toTower + "塔"); moveDisks(n - 1, toTower, auxTower, fromTower); } } }