简单的说,有3根柱子,其中一根由大到小叠着若干个圆盘,要求每次只能移动一个圆盘,无论如何移动都要保持每一根柱子上是小的圆盘在大的圆盘上面,最终把所有圆盘移动到另一根柱子上。
'''
本程序使用递归函数模拟汉诺塔的移动过程,使用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)
请输入圆盘的个数: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]
********************