您的位置:首页 > 编程语言 > Python开发

Python学习:13、使用python实现汉诺塔(河内塔)

2019-03-15 20:31 190 查看

汉诺塔问题是一个经典的问题。汉诺塔(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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: