• 汉诺塔问题


    
    '''
    汉诺塔问题不管在任何编程语言里都是经典问题,是采用递归算法的经典案例,该问题可以抽象如下:
    
    一 3根圆柱A,B,C,其中A上面串了n个圆盘
    
    二 这些圆盘从上到下是按从小到大顺序排列的,**大的圆盘任何时刻不得位于小的圆盘上面**
    
    三 **每次移动一个圆盘**,最终实现将所有圆盘移动到C上
    
    
    利用Python语言接近自然语言的特性,开发者可以更容易的将递归算法翻译成程序语句,需要的代码量很小。汉诺塔问题的解决步骤用语言描述很简单,仅三步:
    
    A,B,C三个圆柱,分别为初始位,过渡位,目标位,设A柱为初始位,C位为最终目标位
    
    (1)将最上面的n-1个圆盘从初始位移动到过渡位
    
    (2)将初始位的最底下的一个圆盘移动到目标位
    
    (3)将过渡位的n-1个圆盘移动到目标位
    
    对于递归算法中的嵌套函数f(n-1)来说,其初始位,过渡位,目标位发生了变化
    '''
    
    
    def move(n, a, b, c):  # n为圆盘数,a代表初始位圆柱,b代表过渡位圆柱,c代表目标位圆柱
        if n == 1:
            print(a, '-->', c)
        else:
            move(n - 1, a, c, b)  # 将初始位的n-1个圆盘移动到过渡位,此时初始位为a,上一级函数的过渡位b即为本级的目标位,上级的目标位c为本级的过渡位
            print(a, '-->', c)
            move(n - 1, b, a, c)  # 将过渡位的n-1个圆盘移动到目标位,此时初始位为b,上一级函数的目标位c即为本级的目标位,上级的初始位a为本级的过渡位
    
    
    move(2, 'A', 'B', 'C')
    
    '''
    A --> B
    A --> C
    B --> C
    '''
    
    # n层看成两层,1个为1层,余下的n-1层排序好了
    # n-1层看成2层,1个为1层,余下的n-2层排序好了
    
    # 5层看成2层,1个为1层,余下的4层排序好了
    # 4层看成2层,1个为1层,余下的3层排序好了
    # 3层看成2层,1个为1层,余下的2层排序好了
    # 2层看成1层,1个为1层,余下的1层排序好了
    # 1层 A-->C
    
    
  • 相关阅读:
    [网络流24题]飞行员配对方案问题
    学习笔记——线性基
    HDU 4507 吉哥系列故事——恨7不成妻(数位DP求平方和)
    bzoj1415&洛谷P4206 [NOI2005]聪聪与可可
    后缀自动机(模板+例题)
    最小表示法(模板)poj1059
    求次小生成树(洛谷P4180&bzoj1977)
    KMP poj3942
    最小表示法(模板) CH1807
    数位dp 求山峰数(hill)
  • 原文地址:https://www.cnblogs.com/SkyOceanchen/p/11413014.html
Copyright © 2020-2023  润新知