Java 递归实现汉诺塔小游戏
- 一、规则
- 二、代码实现
- (一)思路
- (二)代码
- (三)复杂度
- 三、运行结果
一、规则
汉诺塔(Tower of Hanoi)是一个经典的数学问题,它涉及到将一堆盘子从一个起始柱子移动到另一个目标柱子,同时借助一个中间柱子进行操作。以下是汉诺塔的规则:
- 有三根柱子,分别称为起始柱、目标柱和中间柱。
- 初始时,所有的盘子按照从大到小的顺序堆叠在起始柱上。
- 每次只能移动一个盘子,并且只能将较小的盘子放在较大的盘子上面。
- 在移动过程中,可以借助中间柱将盘子临时存放。
- 目标是将所有的盘子从起始柱移动到目标柱。
二、代码实现
(一)思路
根据规则可知,使用递归的方式可以解决汉诺塔问题。递归解法的步骤如下:
- 如果只有一个盘子,直接将它从起始柱移动到目标柱。
- 如果有多个盘子,将除了最底下的盘子以外的上方盘子从起始柱移动到中间柱(借助目标柱)。
- 将最底下的盘子从起始柱移动到目标柱。
- 将之前移动到中间柱的盘子从中间柱移动到目标柱(借助起始柱)。
通过不断重复以上步骤,可以将所有的盘子从起始柱移动到目标柱,完成汉诺塔的移动。
请注意,汉诺塔问题的解法具有指数级的时间复杂度,因此在处理大量盘子时可能会变得非常耗时。
(二)代码
public class MyClass {public static void main(String[] args){// 3 是塔的层数,a 是起始柱子,b 是中间柱,c 是目标柱tower(3, 'a', 'b', 'c');}//递归public static void tower(int num, char a, char b, char c) {//只有一个盘子时,直接将它从起始柱移动到目标柱if (num == 1) {System.out.println(a + " --> " + c);} else {//将除了最底下盘子以外的所有盘子视为一个,移动到中间柱tower(num - 1, a, c, b);//将最底下的盘子移动到目标柱System.out.println(a + " --> " + c);//将除了最底下盘子以外的所有盘子视为一个,移动到目标柱tower(num - 1, b, a, c);}}}
(三)复杂度
- 时间复杂度:
O(2^n)
,其中n
是盘子的个数。 - 空间复杂度:
O(n)
。因为递归调用会产生递归栈的开销,递归的深度为n-1
。
三、运行结果
a --> c
a --> b
c --> b
a --> c
b --> a
b --> c
a --> c