Java 递归实现汉诺塔小游戏

一、规则

汉诺塔(Tower of Hanoi)是一个经典的数学问题,它涉及到将一堆盘子从一个起始柱子移动到另一个目标柱子,同时借助一个中间柱子进行操作。以下是汉诺塔的规则:

  1. 有三根柱子,分别称为起始柱、目标柱和中间柱。
  2. 初始时,所有的盘子按照从大到小的顺序堆叠在起始柱上。
  3. 每次只能移动一个盘子,并且只能将较小的盘子放在较大的盘子上面。
  4. 在移动过程中,可以借助中间柱将盘子临时存放。
  5. 目标是将所有的盘子从起始柱移动到目标柱。

二、代码实现

(一)思路

根据规则可知,使用递归的方式可以解决汉诺塔问题。递归解法的步骤如下:

  1. 如果只有一个盘子,直接将它从起始柱移动到目标柱。
  2. 如果有多个盘子,将除了最底下的盘子以外的上方盘子从起始柱移动到中间柱(借助目标柱)。
  3. 将最底下的盘子从起始柱移动到目标柱。
  4. 将之前移动到中间柱的盘子从中间柱移动到目标柱(借助起始柱)。

通过不断重复以上步骤,可以将所有的盘子从起始柱移动到目标柱,完成汉诺塔的移动。

请注意,汉诺塔问题的解法具有指数级的时间复杂度,因此在处理大量盘子时可能会变得非常耗时。

(二)代码

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

猜你喜欢

转载自blog.csdn.net/qq_45256357/article/details/131965586
今日推荐