##问题引入
汉诺塔是什么?
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(如下图所示)
##汉诺塔问题的分析:
##思考解法:
##基础问题分析
@1首先,我们将两个圆盘进行移动,则第一个圆盘可以直接拿到C盘上面,然后第一个圆盘再拿到 B盘上,最后将A盘上的第二个圆盘拿到C上面,再将B盘上的圆盘拿到C上面,完成了整个操作。
那让我们思考一下,如果是n个盘子,我们又该如何操作呢?
其实最终的过程可以归结到两个盘子的移动上面,我们可以把n-1个盘子当作一个整体,把第n个盘子单独看成一部分,现在就可以把问题归结到@1来实现,相同的过程分析以及相同算法思维。
##代码实现的分析
把A,B,C三个盘子看成对应的三部分,N对应的N个盘子。
相应的移动过程可以通过->来表示,例如A->C表示从A盘子移动到C盘子
相应的整体过程的移动可以这样子表示(n-1,A,B,C)表示n-1个盘子从某一个柱子上面移动到另一个的上面,具体的过成我们可以将汉诺塔算法过程包装成一个递归函数,通过调用函数来进行实现。
##具体的代码
#A第一个柱子
#B第二个柱子
#C第三个柱子
def han_nu_ta(n,A,B,C):
if(n == 1):
print(A,"->",B)
return
han_nu_ta(n-1,A,C,B)
han_nu_ta(1,A,B,C)
han_nu_ta(n-1,B,A,C)
han_nu_ta(3,1,2,3)
##实现的结果输出
1 -> 2
1 -> 3
3 -> 1
1 -> 2
2 -> 3
2 -> 1
1 -> 2