本文代码涉及到汉诺塔问题的非递归算法,可能不是很好理解,我在代码中加了大量注释,希望能够有所帮助,如果实在难以理解的话,请搜索这个算法并结合下面的代码进行阅读和理解。感谢国防科技大学刘万伟老师提供算法思路和第一版本的代码。

def hannoi(n):

#用来记录移动过程中每个盘子的当前位置

#初始都在A柱子上,即chr(65+0)

L = [0] * n

#n个盘子一共需要移动2^n-1次才能完成

for i in range(1, 2**n):

#假设盘子编号分别为0,1,2,...,n-1

#第i步应该移动的盘子编号

#正好是i的二进制形式中最后连续的0的个数

b_i = bin(i)

j = len(b_i) - b_i.rfind('1') - 1

print('第'+str(i)+'步:移动盘子'+str(j+1),

chr(65+L[j]),'->', end=' ')

#把ABC三根柱子摆成三角形

#把第j个盘子移动到下一根柱子上

#根据j的奇偶性决定是顺时针移动还是逆时针移动

L[j] = ((L[j]+1)%3 if j%2 == 0 else (L[j]+2)%3)

#下一根柱子,这里65是A的ASCII码

print(chr(65+L[j]))

hannoi(3)

运行结果为:

第1步:移动盘子1 A -> B

第2步:移动盘子2 A -> C

第3步:移动盘子1 B -> C

第4步:移动盘子3 A -> B

第5步:移动盘子1 C -> A

第6步:移动盘子2 C -> B

第7步:移动盘子1 A -> B

基于非递归算法的汉诺塔游戏之Python实现相关推荐

  1. C++非递归解决汉诺塔问题

    汉诺塔问题简述:将塔A上的n个大小不一的盘子借由塔B全部移动到塔C上,且在过程中不能将大盘子放在小盘子上.                  目录 1.算法: 2.具体效果: 3.SeqStack.c ...

  2. python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...

    汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...

  3. 数据结构之递归算法解决汉诺塔问题

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

  4. C语言编程求解圆盘的汉诺塔,课内资源 - 基于80x86汇编的汉诺塔

    一.软件背景介绍 我们今天要陈述的应用叫做汉诺塔,大家可能小时候都接触过类似于鲁班锁,九连环的益智玩具,我们要说的汉诺塔其实也可以说是益智玩具的一种. 下面我们具体介绍一下汉诺塔.汉诺塔有三根杆子A, ...

  5. 用递归与非递归方法实现汉诺塔问题,C语言实现

    如题,直接上代码,注释写的很全了 非递归还是用栈实现 /*包含头文件*/ #include <stdio.h> #define MAXSIZE 60 /*函数声明*/ void Hanoi ...

  6. 递归算法之汉诺塔问题

    问题叙述 故事背景: 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上 ...

  7. 递归算法之汉诺塔的实现

    一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论 ...

  8. 算法与程序设计递归算法理解——汉诺塔

    目录 1.理解汉诺塔问题可以先从下面两点入手 2.列出一到四层汉诺塔移动顺序寻找规律 3.将移动顺序用树状图来表示 4.将树状图转化为程序实现 1.理解汉诺塔问题可以先从下面两点入手 根据汉诺塔移动规 ...

  9. 递归算法 —— Hanoi汉诺塔游戏

    前言 博客主页:干脆面la的主页 gitte链接:干脆面la的gitee仓库 刚学习完递归函数接触汉诺塔问题的时候,汉诺塔问题困扰了我很久.博主花了很长时间理解这道题目,因此整理出了用递归解决汉诺塔问 ...

最新文章

  1. 手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)
  2. 要命的定义函数。。。参数组合。请认真理解!
  3. ArcGIS 复制要素
  4. Python Django 可变参数*与**的区别
  5. 每天定时查询CSDN博客访问量,并通过echarts进行展示
  6. WSL2 安装中文输入法教程 简单有效
  7. 云计算的发展趋势_2020年的云计算发展趋势预测
  8. Windows GUI代码与Windows消息问题调试利器
  9. 小汤学编程之JavaScript学习day03——对象、Array数组、String字符、Date日期、JSON
  10. 响应式布局技术:App如何适配不同尺寸的设备
  11. TrackBack 技术规范
  12. Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源代码实现
  13. win10 3dmax 激活后反复激活和激活码无效问题
  14. 情人节--我们依旧单身(制作属于自己的QQ拼音皮肤)(带全部ps素材)
  15. 使用MongoVUE
  16. 同志社交Blued赴美上市背后的三个问号
  17. 测量中的坐标与时间系统1.2(在大地测量学中)
  18. Debian11更换阿里源
  19. MYSQL基础教程书籍
  20. 看清有关 SDN 的七大认识偏差

热门文章

  1. 如何制作linux系统硬盘,手把手带你自制Linux系统之二 简易Linux的制作
  2. java httpost阻塞_httpclient发送get请求阻塞?
  3. 压缩包安装_SPSS 21 下载(内附压缩包及安装过程)
  4. php7.0 freetype_php7.0.5安装教程
  5. Linux 环境下FC(SAN)磁盘在线删除
  6. js 判断字符串为空的方法
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的文档管理系统
  8. java 窗口鼠标句柄_c#获取窗体句柄模拟鼠标点击
  9. 新手使用struts2,记一次struts2启动出错
  10. Mobile Phone Network CodeForces - 1023F(并查集lca+修改环)