python 数据结构 递归经典实例 汉诺塔(河内之塔)

# 汉诺塔 hanoi 
# 大象放进冰箱里分机构步骤?
# n = 1 (a -> c) 2^1 - 1
# n = 2  (a -> b) (a -> c) (b -> c) 2^2 - 1

#                               | - move 1 from a to c
#       | - move 2 from a to b  | - move 1 from a to b
#                               | - move 1 from c to b

# n = 3 | - move 1 from a to c  | - move 1 from a to c      2^3 -1

#                               | - move 1 from b to a
#       |  - move 2 from b to c | - move 1 from b to c
#                               | - move 1 from a to c


#                                 | - move n-2 from a to c   
#       | - move n-1 from a to b  | - move 1 from a to b
#                                 | - move n-2 from c to b

# n = 3 | - move 1 from a to c  | - move 1 from a to c      2^n -1

#                                 | - move n-2 from b to a
#       |  - move n-1 from b to c | - move 1 from b to c
#                                 | - move n-2 from a to 

# 数学递推式 通项公式求解 
#   F(n) = 2*F(n-1) + 1 = 2^n - 1
#   F(1) = 1 
#   F(2) = 2*(F(1))+1 = 3
#   F(3) = 2*(F(2))+1 = 7
#
# 很明显,我们可以把n这个大问题不断不断地拆解,最终拆解成n=1,把铜片从a放到c这个最终的小问题
# n = n 时还是分三步 1. 把n-1个铜片从a移到b 2. 把最大的铜片从a移到c 3.把在b上的n-1个铜片从b移到c
# n = n-1时,还是分三步 1. 把n-2个铜片从a移到b 2. 把最大的铜片从a移到c 3.把在b上的n-2个铜片从b移到c 
# 只不过相对顺序变了上部的 n-1 递归分支,原来的(a b c)变成了 (a c b), 
# 因为在函数里我们 n = 1 时是第一个放到第三个里面, n-1 递归部分总体是 a -> b,所以要调换形参,次序变为 (a c b)
# 同理下部的 n-1 递归分支 ,实现的是 b -> c ,调换形参,次序变为 (b a c)

def move(n,a,b,c):
    #a,b,c分别是三根柱子,n为套在a柱上的圆圈个数
    if n==1:
        print(a,'-->',c)
        return
    move(n-1,a,c,b)
    move(1,a,b,c)
    move(n-1,b,a,c)

move(3,'A','B','C')  

运行结果:

三个柱子画一画,自己摆一下就懂了,递归的经典实例,懂了就差不多懂递归的思想了,就是大化小,小是结束条件,一直划分到能解决的小条件,和分形树的思想类似,每一步的递归子步都和上一步一样的划分步骤。

posted @ 2020-07-01 22:38  allmenmustdie123  阅读(259)  评论(0编辑  收藏  举报