用Python定义一个函数,用递归的方式模拟汉诺塔问题

【任务需求】

定义一个函数,用递归的方式模拟汉诺塔问题,三个柱子,分别为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)

运行结果

猜你喜欢

转载自blog.csdn.net/Sunny_Boy0518/article/details/134103614
今日推荐