汉诺塔为递归经典题目,代码实现方面的网上资源很多。作者初学Python以及数据结构,试图通过跟踪程序运行步骤,详细理解其递归的过程。因此着重就每一步的运行结果,进行了一些输出(print)跟踪。供大家参考,欢迎高手指点。
本段代码运行后,可以显示递归过程中,类似树状的递归/遍历过程,对作者本人的理解很有帮助。其中,对hanoi(参数1, 参数2, 参数3, 参数4)的4个参数顺序,及其在不同递归层级的作用的认定,是理解递归过程的关键。详见代码底部附注。
Python代码如下:
def move_peg(n, s1, s3): #盘子移动及打印显示
global counter
s3.append(s1.pop()) #移动盘子
counter += 1
print("第%2d步:" % counter, end=' ')
print('n=', n, '\t'*(tab_len - n), S, '\n')
def hanoi(n, s1, s2, s3): #将 n 个盘子从 s1 移至 s3, 以 s2 做为过渡柱
if n == 1:
move_peg(n, s1, s3)
else:
hanoi(n-1, s1, s3, s2) #步骤1:将s1最上面的n-1个盘子移至s2, s3为过渡柱
move_peg(n,s1,s3) #步骤2:如s1中只剩一个盘子, 移动其至s3
hanoi(n-1, s2,