主要是看到这个觉得数学很有用教程系列: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756044276a15558a759ec43de8e30eb0ed169fb11000
弱弱说一句,先看了评论加百度百科才懂,太弱了 -^-
贴源码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
#
'''
汉诺塔移动规律本质:move(n,a,b,c)中n代表盘子,a代表起始位置,b代表中间位置,c代表最终要移到的位置(递归思想)
1.将n-1个盘子从a移到b
2.将最后一个盘子从a移到c
3.将n-1个盘子从b移到c
1中b的作用只是临时存放,将n-1个整体看做单个即很好理解
到第3步时n-1个盘子都在B柱上,原本的A柱应该充当临时存放位置,编程时就需要从编程思想上变量的方向来解读
'''
import sys
def move(n,a,b,c):
if n == 1:
print(a,'-->',c)
else:
move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)
if __name__ == '__main__':
n = int(sys.argv[1])
move(n,'A','B','C')
#分析n=3 move(3,A,B,C)
# move(2,A,C,B)
# move(1,A,B,C) print A --> C
# move(1,A,C,B) print A --> B
# move(1,C,A,B) print C --> B 此时完成所有n-1个盘从a移到b,参考前文注释
#
# move(1,A,B,C) print A --> C 此时完成将最后一个盘子从a移到c
#
# move(2,B,A,C)
# move(1,B,C,A) print B --> A
# move(1,B,A,C) print B --> C
# move(1,A,B,C) print A --> C 参考前文注释第三步,共执行 2^n-1 次