Python实现 — — 汉诺塔问题

article/2025/9/7 18:45:27

我们今天来看一个很有意思的实例,叫做汉诺塔问题。

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

我们编写的代码依旧遵循汉诺塔的规则-----小圆盘上不能放大圆盘,也就是说大的圆盘不能放在小的圆盘上面。

我们先来看一下代码(这里我们先设只有两个圆盘):

count=0
def hanoi(n,a,b,c):global countif n == 1 :print("{}:{}->{}".format(1,a,c))count+=1else:hanoi(n-1,a,c,b)print("{}:{}->{}".format(n,a,c))hanoi(n-1,b,a,c)count+=1hanoi(2,"A","B","C")
print(count)

我们在这里设三根柱子从左往右分别为ABC,我们先试试2个圆盘。

我们先看代码的输出:

输出部分分为两段 :

(1)该怎么搬运
(2)需要多少步

怎么搬运也分为两部分:

(1)搬运的圆盘是第几层的
(2)从哪根柱子搬运到哪根柱子

一下理解代码有点困难我们先缩减代码,我们先把计算需要多少步的代码删减,你们先自己试试一下可以删减几行代码。

这是删减完的代码:

def hanoi(n,a,b,c):if n == 1:print("{}:{}->{}".format(1,a,c))else:hanoi(n-1,a,c,b)print("{}:{}->{}".format(n,a,c))hanoi(n-1,b,a,c)hanoi(2,"A","B","C")

OK,我们缩减完代码后下一步就要将这个问题抽象,现在我们知道了题目,但怎么解呢?我们把这个解分为三步:

(1)将上面的n-1个圆盘,从A借助C移动到B
(2)将最下面的一个圆盘,从A移动到C
(3)将上面的n-1个圆盘,从B借助A移动到C

(n-1代表除了最下面一个圆盘的所有圆盘,现在不理解没关系后面有解释,现在只需要记住就行了)

接下来我们只需要理解hanoi函数,hanoi函数是一个递归函数,所以分为基例部分和递归链条部分,其中基例部分很好理解,当n=1时,则打印1:A->C。如果n>1则执行第5第6第7行代码,但我们要知道递归函数中的基例和递归链条是密不可分的,我们设n=2时,则先执行的代码是第5行,但代码不知道n=1时该怎么办,所以又重新执行函数寻找答案,代码发现当n=1时执行基例的部分,所以打印1:A->C?我们知道了代码的输出结果所以知道这是不对的,原因就是我们把函数的原本的顺序(a,b,c)变成了(a,c,b)所以输出的结果是1:A->B。

以此类推我们很快就能理解第6第7行代码了。但这样思考就是对的吗,假如现在把圆盘加到20个,那一共有1048575步,25个圆盘有33554431步,如果我们依然和二个圆盘一样去思考肯定是不行的。

这个时候我们就需要理解计算机思维,其中最重要的就是自动化和抽象,而这里就是抽象,我们要把n-1看做一个整体,看做除了最后一个圆盘的所有圆盘:

我们不断的将n进行n-1的操作,直到n=2时,再算出来的n就等于1了,这个时候n就会进入基例部分不会进入递归链条

所以n-1就是除了最后一个圆盘的所有圆盘,这样理解的话我们瞬间就能理解第5行代码在干什么了,第5行代码表达的意思就是第一步,把n-1个圆盘移到B柱子上,接下去的第6第7行分别对应着第二和第三步。

怎么样有没有醍醐灌顶,如果你之前无法理解什么叫抽象那么想现在应该能初步理解一点了。那么这次精彩的实例分享就到此结束了,在这里我祝大家在2023年里学习一帆风顺,bug越来越少。


http://chatgpt.dhexx.cn/article/vQskOgL7.shtml

相关文章

汉诺塔问题(Python实现)

前言 1.先谈一下什么是递归? 我自己的理解就是:将自身的问题不断减小规模,直到减小到无法减小为止。(到达递归结束条件)然后从小问题开始解决,小问题逐个解决之后,大问题也就迎刃而解了&#…

汉诺塔问题详解(C语言)

文章目录 前言1. 导入汉诺塔问题2. 预备知识3. 分析问题4. 编程解决问题 前言 汉诺塔问题是一个古典的数学问题,本文主要和大家一起用c语言解决汉诺塔问题。 1. 导入汉诺塔问题 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜…

汉诺塔问题——递归算法

一、问题描述 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把…

汉诺塔问题详解

目录 一、汉诺塔问题 二、汉诺塔问题思路 三、图示化思路 1、汉诺塔一个盘子 2、汉诺塔两个盘子 3、汉诺塔三个盘子 4、想法 四、代码的实现 一、汉诺塔问题 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源…

c语言汉诺塔问题详解

一、前言 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按…

图解汉诺塔问题(递归求解)

汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆…

汉诺塔(Hanoi)问题归纳总结

一.汉诺塔问题及其递归算法 1.问题阐述 经典汉诺塔: 外文算法书对汉诺塔问题的描述: 2.算法步骤 三阶汉诺塔问题解题步骤 共需7步。 四阶汉诺塔问题解题步骤 共需15步 五阶汉诺塔问题解题步骤 可以清晰的看出分治思想以及递归过程 算法采用了分治的…

汉诺塔问题(Hanoi)

汉诺塔问题,是心理学实验研究常用的任务之一。该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A、辅助柱B及目标柱C。 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置…

经典递归算法——汉诺塔问题

一、问题背景简介 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上&#xff…

【C语言】递归详解汉诺塔问题

文章目录 前言汉诺塔移动图解汉诺塔移动次数汉诺塔的打印结语 如果无聊的话,就来逛逛 我的博客栈 吧! 🌹 前言 汉诺塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小…

Linux基本操作---实践+理解--CentOS 7

目录 CentOS系统ls查看信息cd目录切换文件操作系统关闭/重启防火墙操作 CentOS系统 Linux系统有很多,常见的Linux系统有乌班图(Ubuntu)、深度(deepin)、CentOS等等,CentOS 7 是目前比较流行的Linux操作系统…

Linux 文件操作基本命令

在Linux文件操作中,最常用的基本命令包括:打开或者创建文件,写入文件,读取文件 下面将依次介绍这几种操作的常用方法。 1.打开/创建文件 首先说明在VI编辑模式中,若要使用该API,需包含相应的头文件&…

Linux基本操作命令 实验

一、实验目的: 1. 熟悉Linux基本命令。 2. 熟悉Linux操作系统。 二、实验环境: 一台装有Linux的机器。 三、实验内容: 1.文件操作命令的使用。 用vi编辑器新建一个testl文件 输入this is testl~! 查看文件与目录ls 进入…

linux的基本操作命令

1.使用timedatectl查看时间状态 列出所有已知时区 修改时区为列出时区的某一个 首先打开linux系统,进入管理员模式,输入timedatectl [rootroot ~]# timedatectl Local time: Sun 2022-03-20 17:26:05 CSTUniversal time: Sun 2022-03-20 09:26:05 …

Linux实验一:熟悉Linux基本命令

【实验目的】 ‏(1)熟悉常用的文件和目录类命令。 ‏(2)熟悉常用的进程管理类命令。 ‎ ‏【实验要求】 ‎ 本实验的主要任务是在Linux终端窗口中练习已经学过的各种命令,熟练掌握常用命令的用法。清大家按照以下步骤完成本次实验。 ‏(1)以普通用户登录系统&…

linux配置网口的ip地址,Linux基本操作和基础命令(Linux修改IP地址以及修改网卡地址)...

Linux基本操作和基础命令(Linux修改IP地址以及修改网卡地址) 今天博主和大家聊一聊 Linux的基本操作,不喜勿喷,如有建议欢迎补充,讨论。 一.Linux网络 1.网卡的命名规则 CENTOS7采用dmidecode采集命名方案,以此来得到主板信息&…

Linux基本命令及编程环境实验

目录 一、Linux基本命令详细汇总 1、目录及文件相关命令 2、系统信息查询 3、文件操作(统计、过滤、搜索、权限) 4、其他命令 二、Linux终端上vi命令编程 1、进入vi命令模式 2、vi编辑模式 3、最后行模式 4、vi 编辑C源程序并编译运行 最后 一…

linux基本命令大全

基本命令 关机:shutdown -h halt init 0 poweroff 重启:shutdown -r reboot init 6 pwd:查看工作目录 ls:查看指定目录的内容 -l:列表显示 -a:显示所有,包括隐藏文件 -h:人性化的显示…

linux用户基本操作

用户的管理 1.创建一个新用户user1 ,设置其主目录为/home/use1 useradd user1 -d /home/user12.查看/etc/passwd文件的最后一行,看看如何记录 vim /etc/passwd3.查看文件/etc/shadow文件的最后一行 vim /etc/shadow4.给用户设置密码 passwd user1 123456//密码…

linux课程--实验一 Linux 基本命令操作1

一、实验目的: (1)掌握Linux各类命令的使用方法。 (2)熟悉Linux字符界面操作环境。 二、实验准备 (1)了解Linux命令行的基本概念。 (2)自己建立目录结构以及目录下的文件。 三、实验过程(内容包括:(1)练习linux命…