Python中使用递归函数模拟汉诺塔的解题过程

1. 汉诺塔简介,参考百度百科


简单的说,有3根柱子,其中一根由大到小叠着若干个圆盘,要求每次只能移动一个圆盘,无论如何移动都要保持每一根柱子上是小的圆盘在大的圆盘上面,最终把所有圆盘移动到另一根柱子上。

2. Python程序实现汉诺塔钥匙过程

'''
本程序使用递归函数模拟汉诺塔的移动过程,使用A、B、C三个列表模拟三根汉诺塔柱子,列表中的数代表汉诺塔圆盘,数值大小代表圆盘大小
'''
stepCnt = 0  #移动的步骤数
def moveDisk(diskNum, pillarA, pillarB, pillarC):
    '''
    实现把Num个圆盘按汉诺塔的规则从A柱子借助B柱子移动到C柱子的过程
    :param diskNum: 要移动的圆盘总数
    :param pillarA: 圆盘的原始位置
    :param pillarB: 圆盘的过渡位置
    :param pillarC: 圆盘的目标位置
    :return: None
    '''
    global stepCnt, listA, listB, listC  #在递归函数中调用外部变量前一定要先把变量声明的global,不知道其中的原理是什么,还请大佬指教

    if diskNum < 1:
        return None
    if diskNum == 1:
        pillarC.append(pillarA.pop())  #只有一个圆盘的时候,直接把它从A移动到C即可
        stepCnt += 1
        # 打印每一步移动后柱子上的圆盘情况
        print("STEP: {}".format(stepCnt))
        print("pillarA: {}".format(listA))
        print("pillarB: {}".format(listB))
        print("pillarC: {}".format(listC))
        print("*" * 20)
        return None
    if diskNum >= 2:
        moveDisk(diskNum - 1, pillarA, pillarC, pillarB)  #先把diskNum-1个圆盘借助从A借助C移动到B
        moveDisk(1, pillarA, pillarB, pillarC)  #把A上剩下的最大的一个移动到C
        moveDisk(diskNum - 1, pillarB, pillarA, pillarC)  #最后把B上的diskNum-1个圆盘借助A移动到C
        return None

#由用户定义圆盘的数量
inBuf = input("请输入圆盘的个数:")
diskNum = int(inBuf)

#生成列表模拟圆盘和柱子
listA = list(range(1, diskNum + 1))
listA.reverse()
listB = list()
listC = list()

#开始移动之前打印柱子上的圆盘情况
print("Before moving:")
print("pillarA: {}".format(listA))
print("pillarB: {}".format(listB))
print("pillarC: {}".format(listC))
print("*" * 20)

#移动圆盘
moveDisk(diskNum, listA, listB, listC)

3. 程序执行结果

请输入圆盘的个数:4
Before moving:
pillarA: [4, 3, 2, 1]
pillarB: []
pillarC: []
********************
STEP: 1
pillarA: [4, 3, 2]
pillarB: [1]
pillarC: []
********************
STEP: 2
pillarA: [4, 3]
pillarB: [1]
pillarC: [2]
********************
STEP: 3
pillarA: [4, 3]
pillarB: []
pillarC: [2, 1]
********************
STEP: 4
pillarA: [4]
pillarB: [3]
pillarC: [2, 1]
********************
STEP: 5
pillarA: [4, 1]
pillarB: [3]
pillarC: [2]
********************
STEP: 6
pillarA: [4, 1]
pillarB: [3, 2]
pillarC: []
********************
STEP: 7
pillarA: [4]
pillarB: [3, 2, 1]
pillarC: []
********************
STEP: 8
pillarA: []
pillarB: [3, 2, 1]
pillarC: [4]
********************
STEP: 9
pillarA: []
pillarB: [3, 2]
pillarC: [4, 1]
********************
STEP: 10
pillarA: [2]
pillarB: [3]
pillarC: [4, 1]
********************
STEP: 11
pillarA: [2, 1]
pillarB: [3]
pillarC: [4]
********************
STEP: 12
pillarA: [2, 1]
pillarB: []
pillarC: [4, 3]
********************
STEP: 13
pillarA: [2]
pillarB: [1]
pillarC: [4, 3]
********************
STEP: 14
pillarA: []
pillarB: [1]
pillarC: [4, 3, 2]
********************
STEP: 15
pillarA: []
pillarB: []
pillarC: [4, 3, 2, 1]
********************

你可能感兴趣的:(Python练习代码,Python,汉诺塔)