问题描述:
汉诺塔游戏,现在有ABC三根柱。要求:将A柱所有的圆盘放到C柱。在移动的过程中可以借助B柱。并且规定大圆盘不能放小圆盘上,每次只能移动一个盘子。用递归的方式来解决汉诺塔问题。
解题思路:

  • 假定最上面是第一层为1号圆盘,简称1号,最下面一层最大第n层为n号圆盘,简称n号
  • 需要先将n-1层按规则移到B柱,即B柱从上到下为 1号、2号、… 、n-1号,C柱空出,A柱只剩下最大的n号一个
  • 然后A柱的第n层n号,移到C柱上,再将B柱的1——n-1号按规则,移到C上,完成移动
  • 当只有1层时,将A柱1号,移到C柱,完成
  • 当只有2层时,先将A柱1号,移到B柱,A柱2号移到C柱,然后,将B柱1号移到C柱,完成
  • 当只有3层时,先将A柱1号,移到C柱,A柱2号移到B柱,然后,将C柱1号移到B柱,这样就将n-1层全部移动了B柱,A柱只剩下n号(即3号),C柱空出。
  • 当有4层时,将前3层称到B注,把C柱空出来,即将1号称到B柱,直到n-1层全部移到B柱。
  • 如此循环搬运即可完成n层汉诺塔移动。
  • 由此可以推导出两个结论:
  1. n层汉诺塔至少需要移动 (2^n) -1 次

    • 1层 需要 1次 (2^1)-1
    • 2层 需要 3次 (2^2)-1
    • 3层 需要 7次 (2^3)-1
    • 4层 需要 15次 (2^4)-1
    • 5层 需要 31次 (2^5)-1
  2. 奇数层:最上面一层1号最先移动到C柱,可确保 n-1 层全部移到B柱;偶数层:最上面一层1号,最先移动到B柱,可确保 n-1 层全部移到B柱
  • 完整代码如下: (如果转载,标明来源,谢谢!)
count1 = 0  # 计数器def move(num1, a, b, c):a_key = list(a.keys())[0]b_key = list(b.keys())[0]c_key = list(c.keys())[0]a2 = a[a_key].pop(-1)c[c_key].append(a2)l1 = sorted([a_key + " : " + "、".join(a[a_key]), b_key + " : " + "、".join(b[b_key]), c_key + " : " + "、".join(c[c_key])])str0 = f"*******第{num1}次搬动:将 {a_key} 圆盘{a2} 搬到 {c_key} \n  搬动后:{l1[0]}\n{' '*10+l1[1]}\n{' '*10+l1[2]}"return str0def huanruota(level, a, b, c):global count1if level == 1:count1 += 1print(move(count1, a, b, c))else:huanruota(level - 1, a, c, b)count1 += 1print(move(count1, a, b, c))huanruota(level - 1, b, a, c)def main():while True:print("需要输入汉诺塔的层数数字,如9层,输入数字9,输入q表示放弃即既退出")level_str = input("请输入数字(1-9)或 q :").strip()if level_str not in "123456789qQ" or len(level_str) > 1:print("请输入正确的数字,层数过大,系统会崩溃的!!!\n")continueelif level_str == "q" or level_str == "Q" or level_str == "":breaklevel = int(level_str)list1 = []for i in range(level, 0, -1):list1.append(str(i))print("初始状态:A柱:" + "、".join(list1) + "\n" + " " * 10 + "B柱" + "\n" + " " * 10 + "C柱")huanruota(level, {"A柱": list1}, {"B柱": []}, {"C柱": []})print(f"☺☺☺  已按要求完成{level}层汉诺塔从A柱将所有的圆盘放到C柱 ☺☺☺\n")global count1count1 = 0if __name__ == "__main__":main()

运行结果显示:

如有不详尽地方或改进地方,欢迎留言讨论。

汉诺塔完整代码及分析相关推荐

  1. 递归-汉诺塔(代码、分析、汇编)

    代码: #include <stdio.h>void hanoi(int n, char a, char b, char c) {if( n > 0 ){if( n == 1 ){p ...

  2. python3简单代码_python3实现简单汉诺塔的代码教程

    python3实现简单汉诺塔的代码教程 #!/usr/bin/env python3 #_*_*_ coding: utf-8 _*_*_ #汉诺塔 # def hannuota(n,N,M): # ...

  3. 汉诺塔python代码解释_Python-汉诺塔原理分析

    最近在"廖雪峰的官方网站"学习Python,遇到汉诺塔递归问题百思不得其解,先是百度了汉诺塔原理,然后查看了别人的写的文章,通过整理汇总,希望能够帮助其他人理解. 汉诺塔原理:(来 ...

  4. 汉诺塔python代码解释_python实现汉诺塔算法

    题目: 汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材. 除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,3],其含义是这是一个有5个圆盘的汉诺塔,每一个数字代表 ...

  5. 汉诺塔递归问题的分析与Python实现

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

  6. 个盘子的汉诺塔需要移动几步_坨——理解递归实现quot;汉诺塔quot;代码的关键...

    我记得,大学学C语言时,在函数递归调用那一节有个作业,就是写汉诺塔.不少同学遭遇到困难.在知乎上遇见的就有: 如何理解汉诺塔的递归?​www.zhihu.com 题主发出悲鸣:"--学C++ ...

  7. 汉诺塔——老夫不管什么分析不分析,直接粗暴

    直接上图开干: 1个盘子直接从A放到C(递归出口),大于1个不管你有多少盘子,我始终把你当成两个盘子,即第n个和第(n-1)个,那就是把(n-1)放到B,把n放到C,再把(n-1)放到C,递归思想大功 ...

  8. c语言程序代码应缩进几格,汉诺塔c语言程序代码

    汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解) 让我们先看看代码吧 #include int hj(int a,int b, int c,int i) { int t; if(i==1) p ...

  9. 汉诺塔代码执行的流程图

    汉诺塔是递归中的经典问题,很多人虽然懂得如何写汉诺塔的代码,但是并不能够完整地明白汉诺塔代码的调用逻辑.作者花了点时间,画了一张流程图,希望能够帮大家理解. 先上代码: #include"s ...

最新文章

  1. 区块链BaaS云服务(34)新加坡艾达链ASC
  2. leetcode 520. 检测大写字母(Java版)
  3. 代码规范利器-阿里代码规范插件
  4. JS验证邮箱格式、信用码、税号和注册号
  5. 计算机视觉————理解彩色图片
  6. 为知笔记打不开 ziw 文件问题
  7. java 移动短代支付_运营商支付/短代支付的市场前景如何?
  8. UEFI学习(一)-EDK II环境搭建
  9. 如何减小电压跟随器输出电阻_逐次比较式模数转换器如何获取最佳采样频率
  10. 如何解决Excel文档已损坏呢?
  11. Scrapy抓站:大批量下载360指定专题下的照片并保存到sql和本地文件夹下
  12. node下载(使用nvm的方式)
  13. 春招大盘点:找工作除了招聘网站还有哪些渠道?
  14. Python+Appium+夜神模拟器 全流程从环境搭建到实现自动化(APP自动化)
  15. 站长工具大全,站长工具哪个好用,站长在线工具
  16. [安卓刷机实战]小米/红米手机刷机降系统图文教程-解锁小米手机-K30 5G版[开箱可用][解锁+刷机全步骤教程]
  17. 目标检测AP、mAP计算方法
  18. 面具卡米怎么删模块_面具magisk ROOT如何更新到最新版本两种实用方法彻底解决...
  19. 常州买衣服(优先队列)
  20. 生物学丨PsbA丨D1 protein of PSII应用实例

热门文章

  1. Java研发小试(面试题)
  2. 计算机更新后打印机无法使用,Win10升级后惠普打印机无法打印的解决方法
  3. python高级算法与数据结构:“你如何压缩一部英文著作”,一道来自大厂的真实面试题
  4. 2014.华为实习招聘数字芯片(转)
  5. jdk17下载与安装教程(win10),超详细
  6. python 词语频率统计_计算词和词组频率的Python nltk
  7. drv8833 马达控制
  8. c++ 调用opencv+tesseract做图片文字识别
  9. 笔记之 02_传智播客AJAX视频教程_使用IntelliJ开发Web项目
  10. 如何根据选股条件选择基本面量化股票池?