汉诺塔问题深度剖析(python实现)

当我们学习一门编程语言的时候,都会遇到递归函数这个问题。而学习递归的一个经典案例就是汉诺塔问题。通过这篇文章,观察移动三个盘子和四个盘子的详细过程,您不仅可以深刻的了解递归,也更加熟悉了汉诺塔的游戏的玩法。

更好的阅读体验可访问 这里。

规则

有a、b、c三个柱子,a从上到下,从小到大有n个盘子。要求把a上所有盘子移动到c,一次只能移动一个盘子,且大盘子不能放小盘子上。

方法

  1. 当a上有一个盘子时,直接把该盘子移动到c。
  2. 当a上有n个盘子时(n > 1):

    先把a上n-1个盘子移动到b,
    再把a上最后一个盘子移动到c,
    再把b上所有盘子移动到c。

代码实现

def mov(n,a,b,c):if n == 1:# 如果a上只有一个盘子,直接把a移动到cprint(a,'-->',c)else:# 先把a上的n-1个盘子移动到bmov(n-1,a,c,b)# 再把a上最后一个盘子移动到cmov(1,a,b,c)# 最后把b上所有盘子(n-1个)移动到cmov(n-1,b,a,c)num = abs(int(input('一共有几个盘子:')))
print('\n移动步骤为:')
mov(num,'A','B','C')

3个盘子的实例

  1. 先把a上的2个移动到b

    先把a上的1个移动到c
    再把a上最后1个移动到b
    再把c上仅有的一个移动到b

  2. 再把a上最后一个移动到c
  3. 再把b上的两个移动到c

    先把b上的一个移动到a
    再把b上最后一个移动到c
    再把a上仅有的一个移动到c

也就是:

A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

4个盘子的实例

  1. 先把a上的三个移动到b(套用上面三个盘子的情况,只不过之前是移动到c,现在是b)

    先把a上的2个移动到c

    先把a上的1个移动到b
    再把a上最后1个移动到c
    再把b上仅有的一个移动到c

    再把a上最后一个移动到b

    再把c上的两个移动到b

    先把c上的一个移动到a
    再把c上最后一个移动到b
    再把a上仅有的一个移动到b

  2. 再把a上最后一个移动到c
  3. 再把b上的3个移动到c(还是第一步的思路,只是换了个柱子)

    先把b上的2个移动到a

    先把b上的1个移动到c
    再把b上最后1个移动到a
    再把c上仅有的一个移动到a

    再把b上最后一个移动到c

    再把a上的两个移动到c

    先把a上的一个移动到b
    再把a上最后一个移动到c
    再把b上仅有的一个移动到c

    也就是:

    A --> B
    A --> C
    B --> C
    A --> B
    C --> A
    C --> B
    A --> B
    A --> C
    B --> C
    B --> A
    C --> A
    B --> C
    A --> B
    A --> C
    B --> C

这样就清晰的看出移动的各个步骤。

总结

再反过来分析一下,当移动一个盘子的时候只需一步就能完成,对应于代码中的

    if n == 1:# 如果a上只有一个盘子,直接把a移动到cprint(a,'-->',c)

当移动两个盘子的时候,得需要三步才能完成。例如:把a上的两个盘子移动到c

  1. 先把a上的1个移动到b
  2. 再把a上最后1个移动到c
  3. 再把b上仅有的一个移动到c

当移动三个盘子的时候,就可以分解成先移动两个盘子,再移动一个盘子。
当移动四个盘子的时候,就可以分解为先移动三个盘子,再移动一个盘子。依次类推。。

可见当移动两个或两个以上个数盘子的时候,都只需要三步就可以完成。其中每一步又可以分解为三步,直到只剩下一个盘子的情况。对应于代码中的

    else:# 先把a上的n-1个盘子移动到bmov(n-1,a,c,b)# 再把a上最后一个盘子移动到cmov(1,a,b,c)# 最后把b上所有盘子(n-1个)移动到cmov(n-1,b,a,c)

所以,汉诺塔问题,你了解了吗?

参考:python下实现汉诺塔

转载于:https://www.cnblogs.com/sfriend/p/10862230.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS-QQ临时对话、QQ群申请跳转

QQ 临时对话 NSString *qq [NSString stringWithFormat:"mqq://im/chat?chat_typewpa&uin%&&version1&src_typeweb","这是是QQ号码"];NSURL *urlQQ [NSURL URLWithString:qq];[[UIApplication sharedApplication] openURL:urlQQ]; QQ 申…

[luoguP2331] [SCOI2005]最大子矩阵(DP)

传送门 orz不会做。。。 一个好理解的做法(n^3*k): 分n1和n2两种情况考虑。 n1时,预处理出前缀和sum[]。 设f[i][j]为到达第i格,已经放了j个子矩阵的最大和, 那么每次先把f[i][j]的值设为f[i-1][j]&#xf…

想要去阿里面试?你必须得跨过 JVM 这道坎!

概述 很多人想要到阿里巴巴、美团、京东等互联网大公司去面试,但是现在互联网大厂面试一般都必定会考核JVM相关的知识积累和实践经验,毕竟线上系统写好代码部署之后,每个工程师都必须关注JVM相关的东西,比如OOM、GC等问题. 所以一…

医学知识图谱一

大纲 知识自动提取技术 医学知识融合 医学知识推理 转载于:https://www.cnblogs.com/quietwalk/p/9000950.html

在一个div里,列表样式图片进行float,实现水平排序

<div class"xiangce"><ul> <li><a href"#"><img src"images/pic4.gif" alt"">产品名称</a></li><li><a href"#"><img src"images/pic4.gif" alt"…

团队开发git使用各种问题

参考:https://www.cnblogs.com/schaepher/p/4933873.html 问题-3:保持github上项目干净&#xff0c;对于在不同机器上运行会不同的文件不予维护(如.idea/workspace.xml) 建议:对于项目输出在项目目录中的文件不予维护 对于IDE自动生成且与项目所在目录有关的文件不予维护 将这些…

filebeat 乱码

查看 文件的类型 [rootelk-node-1 rsyslog] # file 192.168.1.16.log 192.168.1.16.log: Non-ISO extended-ASCII text, with very long lines, with LF, NEL line terminators 如果命令返回结果说明改日志为utf-8&#xff0c;则logstash配置文件中charset设置为UTF-8 如果命令…

团队编程项目代码设计规范(爬取豆瓣电影top250)

基本格式 缩进 使用4个空格进行缩进 行宽 每行代码尽量不超过80个字符 理由&#xff1a; 这在查看side-by-side的diff时很有帮助方便在控制台下查看代码太长可能是设计有缺陷换行 Python支持括号内的换行。这时有两种情况。 第二行缩进到括号的起始处foo long_function_name(v…

程序员的浪漫

程序员的浪漫 马上就到520了&#xff0c;各位小伙伴想好了准备什么礼物送个自己的另一半呢&#xff1f;还没想好的注意啦&#xff01;&#xff01;现在还有机会&#xff0c;今天给大家分享一些程序员的浪漫创意礼物&#xff0c;希望你可以从中找到一些灵感。 One Link&#xff…

14-1 部署项目

1313转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/9011671.html

The listener supports no services

$ lsnrctl start 报错提示: The listener supports no services The command completed successfully 如图所示&#xff1a; 这样启动后远程连接会报错&#xff1a; oracle ORA-12514:TNS:listener does not currently know of service requested in connect descriptor 问题原…

Luogu P2577 [ZJOI2005]午餐

一道贪心类背包DP的好题 首先发现一个十分显然的性质&#xff0c;没有这个性质整道题目都难以下手&#xff1a; 无论两队的顺序如何&#xff0c;总是让吃饭慢的人先排队 这是一个很显然的贪心&#xff0c;因为如果让吃饭慢的排在后面要更多的时间至少没有这样优 因此我们先按吃…

SEO【总结】by 2019年5月

2019独角兽企业重金招聘Python工程师标准>>> 关键点&#xff1a; 1、代码 1.1、seo前端代码&#xff1a;基于Html代码的SEOherf&#xff1a;https://my.oschina.net/u/2862573/blog/3030664 注意的要点&#xff1a; h1&#xff0c;h2的内容很关键 网页的压缩、静态化…

Linux 系统的启动顺序

第一步&#xff1a;加载BIOS当你打开ia计算机的电源&#xff0c;计算机会首先加载计算机主板的BIOS信息&#xff0c;因为它包含了CPU的相关信息&#xff0c;设备启动顺序[安装系统的U盘启动顺序]&#xff0c;内存信息&#xff0c;时钟信息&#xff0c;PnP特性等等&#xff0c; …

Oracle数据库 查看表是否是 索引组织表的方法

1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一个字段. 见图: 转载于:https://www.cnblogs.com/jinanxiaolaohu/p/9018037.html

Windows server 2016 搭建RDS服务

计算机的更新换代太快&#xff0c;新购置的计算机没几年便觉得运行速度越来越慢&#xff0c;尤其是在运行一些比较大的应用程序是&#xff0c;用户总是抱怨运行速度太慢或者总是死机等问题。如果要更换新的计算机&#xff0c;又得不到领导的批准&#xff0c;因此对于企业来说&a…

π 的定义(极限)

圆周率&#xff0c;周长&#xff08;2πr&#xff09;与直径&#xff08;2r&#xff09;的比值。在名称上&#xff0c;是通过计算命名的。 1. 刘徽割圆与圆周率 π 通过圆内接正多边形的周长来计算圆周长&#xff0c;是三世纪中期我国魏晋时代的数学家刘徽的光辉思想。 对于圆内…

前端开发浏览器兼容问题

csshack 1234567我很少使用hacker的&#xff0c;可能是个人习惯吧&#xff0c;我不喜欢写的代码IE不兼容&#xff0c;然后用hack来解决。不过hacker还是非常好用的。使用hacker我可以把浏览器分为3类&#xff1a;IE6 &#xff1b;IE7和遨游&#xff1b;其他&#xff08;IE8 chr…

springboot2.0 多数据源整合问题 At least one JPA metamodel must be present!   at

2019独角兽企业重金招聘Python工程师标准>>> 数据源代码&#xff1a; 第一个读取配置文件代码&#xff1a; package com.datasource;import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.sp…

好书推荐

阿尔花剌子模:代数学. 乔治波利亚:怎样解题:数学思维的新方法. Anany Levitin:算法设计与分析基础.转载于:https://www.cnblogs.com/mtl6906/p/7625290.html