汉诺塔问题:相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
使用递归的方式解决汉诺塔问题
定义一个整数变量nDisks,其值为3。
调用doTowers方法,传入nDisks、''A''、''B''、''C''四个参数。''A''表示圆环的起始半径,''B''表示圆环的终止半径,''C''表示圆环的终止半径。
doTowers方法是一个递归方法,用于计算圆环的高度。
a. 如果topN的值为1,表示只有一个圆环,直接打印圆环的起始和终止半径。
b. 如果topN的值大于1,表示有多个圆环,先调用doTowers方法递归计算topN-1个圆环的高度,然后打印当前圆环的起始和终止半径。
public class Main {
public static void main(String[] args) {
int nDisks = 3;
doTowers(nDisks, 'A', 'B', 'C');
}
private static long[] dp;
public static void doTowers(int topN, char from, char inter, char to) {
if (topN == 1) {
System.out.println("Disk 1 from " + from + " to " + to);
} else {
doTowers(topN - 1, from, to, inter);
System.out.println("Disk " + topN + " from " + from + " to " + to);
doTowers(topN - 1, inter, from, to);
}
}
}
运行结果:
Disk 1 from A to C
Disk 2 from A to B
Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A
Disk 2 from B to C
Disk 1 from A to C