'''
1、解决汉诺塔问题之前先简单讲解一下我对递归思想的理解,
即:我们可以将一个问题分解为无数个次一级的问题,再通过对次一级问题的分解,得到一个我们能直接解决的问题 (递)
然后通过反推得到我们最开始的问题的解 (归)
2、一个比较好理解的例子是处理阶乘问题:
n! = n * (n-1)!
……
9! = 9 * 8!
8! = 8 * 7!
7! = 7 * 6!
6! = 6 * 5!
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1
即: n! = n * (n-1) * (n-2) * …… * 3 * 2 * 1
'''
def hannoi(n,x,y,z):
if n==1:
print(x,'-->',z)
else:
hannoi(n-1, x, z, y)
print(x,'-->',z)
hannoi(n-1, y, x, z)
n=int(input("请输入汉诺塔的层级数:"))
hannoi(n, "X", "Y", "Z")
'''
1、假定汉诺塔的层级由上到下分别是:1··2··3··4··5··6·· ··n
假定汉诺塔游戏中的三个区域分别为:起始区、中转区、结束区
2、已知汉诺塔的层次为n层,拆分汉诺塔问题为:
2.1 将第n层以上的层次看做一个整体N,从起始区移动到中转区
2.2 将第n层移动到结束区
2.3 将N移动到结束区(即:将起始区和中转区互换,重复以上步骤)
2.4 设置何时终止2.3的重复(即汉诺塔的层数只有一层的时候,直接将汉诺塔从起始区移动到终止区即可)
n = 1 时,print (x ,'-->', z)
3、因为每解决一层的问题就需要调用一次函数,所以通过改变参数位子顺序和保持输出格式的统一,来保证传参的正确性
'''