zoukankan      html  css  js  c++  java
  • 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')  

    运行结果:

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

  • 相关阅读:
    Symmetrical Network Acceleration with EBS 12
    Using Oracle Database In-Memory with Oracle E-Business Suite
    OI回忆录
    一只退役狗最后的想法
    codeforces-102501J Counting Trees题解
    CCPC2020 秦皇岛 H Holy Sequence
    CodeForces
    2020 ccpc 网络赛 1004 Chess Class
    2020 ccpc 网络赛 1012 Xor
    2020 ccpc 网络赛 1013 Residual Polynomial
  • 原文地址:https://www.cnblogs.com/liuchaodada/p/13222041.html
Copyright © 2011-2022 走看看