【任务需求】
定义一个函数,用递归的方式模拟汉诺塔问题,三个柱子,分别为A、B、C,其中A柱子上有N个盘子,从小到大编号为1到N,盘子大小不同。现在要将这N个盘子从A柱子移动到C柱子上,但移动的过程必须遵循以下规则:
1.每次只能移动一个盘子;
2.盘子只能放在空柱子或者比自己大的盘子上面;
3.每次只能移动最上面的盘子。
题目解析:
假设A柱上只有1片方块 (那么移动方块的步骤显然是 从A移动到C,也可以简单表示成 A-->C)
如果A柱上有2片方块 (3步就可以完成,即:第1步:A-->B 第2步:A-->C 第3步:B-->C
如果A柱上有3片方块(需要7步,才能完成移动)
第1步:A-->C 第2步:A-->B 第3步:C-->B 第4步:A-->C 第5步:B-->A
第6步:B-->C 第7步:A-->C
代码展示:
import easygui
i = 1
title = "汉诺塔问题"
def move(n, mfrom, mto):
global i, msgList
msgList.append("第%d步:将%d号盘子从%s -> %s" % (i, n, mfrom, mto))
i += 1
def hanoi(n, A, B, C):
if n == 1:
move(1, A, C)
else:
hanoi(n - 1, A, C, B)
move(n, A, C)
hanoi(n - 1, B, A, C)
easygui.msgbox(title=title, msg="汉诺塔问题")
while True:
msgList = []
enter = easygui.enterbox(msg="请输入汉诺塔圆盘的个数(Q 退出):")
if enter == "Q" or enter == None:
break
elif not enter.isdigit():
easygui.msgbox(title=title, msg="请输入一个整数,谢谢~~")
else:
hanoi(int(enter), 'A', 'B', 'C')
easygui.choicebox(msg="这是最快的移动步骤:", title=title, choices=msgList)
运行结果