package diqijiangzuoye;
import java.util.Scanner;
public class Hannuota {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
System.out.println("请输入盘子数n=");
int n=input.nextInt();
System.out.println("移动过程为:");
moveDisks(n,'A','B','C');
}
private static void moveDisks(int n, char fromA, char toB, char auxC) {
if(n==1)
System.out.println(n+"号盘从"+fromA+"-->"+toB);
else {
moveDisks(n-1,fromA,auxC,toB);
System.out.println(n+"号盘从"+fromA+"-->"+toB);
moveDisks(n-1,auxC,toB,fromA);
}
}
}
基于Monster 组和GPT的调写:
下面是以 n=4 为例的 moveDisks 函数的执行流程:
第一次调用 moveDisks(4, 'A', 'B', 'C'),由于 n 不为 1,进入 else 分支。
调用 moveDisks(3, 'A', 'C', 'B'),同样进入 else 分支。
调用 moveDisks(2, 'A', 'B', 'C'),同样进入 else 分支。
调用 moveDisks(1, 'A', 'C', 'B'),这次 n 为 1,进入 if 分支,输出 "1号盘从A-->C"。
返回第 4 步的调用,输出 "2号盘从A-->B"。
再次调用 moveDisks(1, 'C', 'B', 'A'),同样进入 if 分支,输出 "1号盘从C-->B"。
返回第 3 步的调用,输出 "3号盘从A-->C"。
调用 moveDisks(1, 'B', 'A', 'C'),同样进入 if 分支,输出 "1号盘从B-->A"。
返回第 2 步的调用,输出 "4号盘从A-->B"。
再次调用 moveDisks(1, 'A', 'C', 'B'),同样进入 if 分支,输出 "1号盘从A-->C"。
返回第 1 步的调用,程序结束。
因此,最终输出的结果为:
1号盘从A-->C
2号盘从A-->B
1号盘从C-->B
3号盘从A-->C
1号盘从B-->A
2号盘从B-->C
1号盘从A-->C
4号盘从A-->B
1号盘从C-->B
2号盘从C-->A
1号盘从B-->A
3号盘从C-->B
1号盘从A-->C
2号盘从A-->B
1号盘从C-->B
这个是一个经典的递归问题,详细说明,你可以搜索“汉诺塔问题”
其实和if关系不大,if是递归终止条件
程序的精髓在于moveDisks内部又调用了2次moveDisks,构成递归。
把最后最后一行的数组拼成一个数字,就是22999