汉诺塔小游戏

作者本文的目标是利用递归求解汉诺塔的具体步骤

汉诺塔是什么

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

在这里插入图片描述

游戏思路

使用递归法,从复杂情况中找到最简单最特殊的情况,这就是递归结束的条件。
分析游戏,本游戏最核心的要求就是在小圆盘上不能放大圆盘
我们将三根柱子分别命名为A,B,C。

public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入圆盘个数:");
        int n=sc.nextInt();
        System.out.println("过程为");
        hanoi(n,'a','b','c');
    }

在开始前,我们要输入圆盘个数,以及各个柱子的名称。

1.最简单的情况——一个圆盘

分析游戏,最简单的情况就是只有一个圆盘
只需将第A柱子上的圆盘移动到C柱子上就可。

在这里插入图片描述
只需要一步,从A柱移动到C柱上。
在这里插入图片描述
该过程简述为 A->C
此时我们可以写出递归的最特殊的情况,n==1;程序代码如下

//这里pos代表柱子
 public static void move(char pos1,char pos2){
        
        System.out.print(pos1 +"->"+ pos2+" ");
    }

运行程序
在这里插入图片描述

依次类推,增加盘子个数

2.两个圆盘

初始情况如下图,A柱上放有两个圆盘

在这里插入图片描述

此时就需要借助B柱来进行移动。
1.先将A柱上的圆盘1移动到B柱上
2.再将A柱上的圆盘2移动到C柱上
3.将B柱上的圆盘1移动到C柱上

第一步
在这里插入图片描述
第二步
在这里插入图片描述
第三步
在这里插入图片描述
该过程简述为 A->B A->C B->C
程序如下

public static void hanoi(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return;
        }
        hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanoi(n-1,pos2,pos1,pos3);
    }

在这里插入图片描述

3.三个圆盘

在进行三个圆盘的移动时,我们总结1个圆盘和2个圆盘的过程,再加上递归的思想,我们的目的是先要将最大的盘也就是图中的盘3先放到C柱上。此时我们的步骤如下
1.先通过C柱将A柱上的1,2盘移动到B柱上
2.将A柱上的3盘移动到C柱上
3.利用A柱,再将B柱上的盘1,2移动到C柱上

在这里插入图片描述
第一步
在这里插入图片描述
在这里插入图片描述
简述过程 A->C A->B C->B
第二步
在这里插入图片描述
简述过程 A->C
第三步
在这里插入图片描述
在这里插入图片描述
简述过程
B->A B->C A->C

在这里插入图片描述

解释递归过程

递归代码如下

public static void hanoi(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return;
        }
        hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanoi(n-1,pos2,pos1,pos3);
    }
    public static void move(char pos1,char pos2){
//        System.out.println("过程为");
        System.out.print(pos1 +"->"+ pos2+" ");
    }

声明,我们这里输入如下
hanoi(n,'a','b','c');
pos1->a
pos2->b
pos3->c
当我们输入n=3时,进入递归中,首先n!=1,所以执行hanoi(n-1,pos1,pos3,pos2);这一步,传入数据为hanoi(2,a,c,b );
这时我们进入另一次递归,也就是从头开始
在这里插入图片描述
此时传入的是hanoi(2,a,c,b);
这时n还是不等于1,则再次进入递归
在这里插入图片描述
这里注意每次形参的位置发生变化
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
进入第二次递归后,此时传入的是hanoi(2,a,c,b);n!=1,进入hanoi(1,a,b,c)
此时n==1,接收到move(a,c)打印a->c.这时第二次递归结束,返回第一次递归中红点这一步,因为我们上一步传入的是hanoi(2,a,c,b);
此时接收到move(a,b),这时打印出a->b.

在这里插入图片描述
这一步完成之后,进入红点下一步的hanoi(n-1,pos2,pos1,pos3);
这以后注意,n的值为2,再次进入递归,以此类推。

完整代码

public class test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入圆盘个数:");
        int n=sc.nextInt();
        System.out.println("过程为");
        hanoi(n,'a','b','c');
    }
    public static void hanoi(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return;
        }
        hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanoi(n-1,pos2,pos1,pos3);
    }
    public static void move(char pos1,char pos3){
//        System.out.println("过程为");
        System.out.print(pos1 +"->"+ pos3+" ");
    }
}

码字不易,感谢观看
如果对你有帮助的话,记得点赞👍评论+关注吧

  • 68
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 42
    评论
Python汉诺塔小游戏是一个经典的递归问题。通过编写Python代码,我们可以将思路转化为具体的代码实现。在这个小游戏中,我们需要移动一些盘子从一个柱子(起始柱子)移动到另一个柱子(目标柱子),并且借助第三个柱子(中间柱子)进行中转。下面是一个Python函数示例,用于展示汉诺塔游戏的过程: ```python def hanoi_game(N, A, B, C): if N == 1: # 如果起始柱子上只有一个盘子,直接移动到目的盘子 print(f'{A}移动到{C}') else: # 如果盘子大于一个,先将剩下的N-1个盘子,借助C,移动到B hanoi_game(N - 1, A, C, B) # 将剩下的那一个盘子,从A移动到C print(f'{A}移动到{C}') # 将在B上的N-1个盘子,借助A,移动到C hanoi_game(N - 1, B, A, C) hanoi_game(3, 'A', 'B', 'C') ``` 这段代码中,我们通过递归的方式实现了汉诺塔游戏的移动过程。在函数内部,我们根据盘子的数量和柱子的编号,将盘子移动到目标柱子上,并且借助中间柱子进行中转。对于N=3的情况,代码将输出每一步的移动过程。通过运行这段代码,你可以在控制台上看到每一步的移动操作。 汉诺塔问题源于一个古老的传说,大梵天创造世界时,将64片黄金圆盘按照大小顺序摞在一根柱子上。任务是将这些圆盘从起始柱子上按照规定的规则移动到目标柱子上,中间可以借助其他柱子进行中转。这个问题可以通过递归的方式解决,而Python的汉诺塔小游戏就是将这个问题转化为代码实现的一个例子。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃南瓜的北瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值