Python学习:13、使用python实现汉诺塔(河内塔)
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。应该如何操作?
分析:
要把4个圆盘从A柱子移动到C柱子上,第一步应该怎么做?虽然可以肯定,第一步唯一的选择是移动A最上面的那个圆盘,但是应该将其移到B还是C呢?很难确定。因为接下来的第二步、第三步……直到最后一步,看起来都是很难确定的。能立即确定的是最后一步:最后一步的盘子肯定也是A最上面那个圆盘,并且是由A或B移动到C——此前已经将3个圆盘移动到了C上。
假设A柱子上存在【3,2,1】(3在底层,1在第一层),把A柱子上的移动到C柱子上。
每次只能移动一个,且移动的只能是该柱子上的第一层,柱子上的每一层的数字必须比下一层的数字小。
1、将A中的1移动到B中,此时A中存在【3,2】,B中存在【1】,C中存在【】
2、将A中的2移动到C中,此时A中存在【3】,B中存在【1】,C中存在【2】
3、将B中的1移动到C中,此时A中存在【3】,B中存在【】,C中存在【2,1】
4、将C中的1移动到A中,此时A中存在【3,1】,B中存在【】,C中存在【2】
5、将C中的2移动到B中,此时A中存在【3,1】,B中存在【2】,C中存在【】
6、将A中的1移动到B中,此时A中存在【3】,B中存在【2,1】,C中存在【】
7、将A中的3移动到C中,此时A中存在【】,B中存在【2,1】,C中存在【3】
8、将B中的1移动到A中,此时A中存在【1】,B中存在【2】,C中存在【3】
9、将B中的2移动到C中,此时A中存在【1】,B中存在【】,C中存在【3,2】
10、将A中的1移动到C中,此时A中存在【】,B中存在【】,C中存在【3,2,1】
根据上边的步骤写成代码
l1 = [i for i in range(10,0,-1)] l2 = [] l3 = [] n = len(l1) def move(n, l1, l2, l3): if n == 1: l3.append(l1.pop()) else: move(n - 1, l1, l3, l2) l3.append(l1.pop()) move(n - 1, l2, l1, l3) if __name__ == '__main__': move(n, l1, l2, l3) print(l1) print(l3)
- 【python学习笔记】使用类封装实现贪吃蛇
- 使用python实现深度神经网络--学习笔记
- python数据结构学习笔记-2016-10-24-02-使用排序列表实现集合ADT
- python学习笔记之使用threading模块实现多线程(转)
- 使用python实现递归版汉诺塔示例(汉诺塔递归算法)
- 神经网络与深度学习 使用Python实现基于梯度下降算法的神经网络和自制仿MNIST数据集的手写数字分类可视化程序 web版本
- python学习笔记之使用threading模块实现多线程(转)
- UNIX网络编程学习(13)--使用select的str_cli函数的实现
- python 学习笔记 13 -- 经常使用的时间模块之time
- 建议13:使用Python模块re实现解析小工具
- python学习笔记之使用threading模块实现多线程(转)
- Python学习(13)--Lambda表达式和switch语句的实现
- python学习笔记之使用threading模块实现多线程(转)
- Python学习13:字符串操作函数使用
- Python学习——实现简单的交互raw_input的使用
- Python Twisted系列教程13:使用Deferred新功能实现新客户端
- python数据结构学习笔记-2016-10-28-02-使用链表实现稀疏矩阵
- 使用python-pygame包生成一个艺术照片-学习笔记13
- 神经网络与深度学习 1.6 使用Python实现基于梯度下降算法的神经网络和MNIST数据集的手写数字分类程序
- Python Flask学习_使用Flask-Migrate实现数据库迁移