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

Posted allmenmustdie123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\')  

运行结果:

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

以上是关于python 数据结构 递归经典实例 汉诺塔(河内之塔)的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 以递归方式做河内塔问题的基准.n = 20来自维基百科的伪代码:https://zh.wikipedia.org/wiki/汉诺塔

Python入门之经典函数实例——第1关:递归函数 - 汉诺塔的魅力

Python入门之经典函数实例——第1关:递归函数 - 汉诺塔的魅力

Java语言中的递归调用--经典汉诺塔

递归解决汉诺塔问题

汉诺塔——递归法