• 递归——汉诺塔问题(python实现)


    规则

    1. 每次移动一个盘子
    2. 任何时候大盘子在下面,小盘子在上面

    方法

    假设共n个盘子

    • 当n=1时:

      1. 直接把A上的一个盘子移动到C上(A->C)
    • 当n=2时:

      1. 把小盘子从A放到B上(A->B)这里开始采用参数,rsc源地址=A,dst目的地址=B
      2. 把大盘子从A放到C上( A->C)rsc=A, dst=C
      3. 把小盘子从B放到C上(B->C)rsc=B, dst=C
    • 当n=3时:

      1. 把A上的两个盘子,通过C移动到B上去, 调用递归实现(A-C->B)rsc=A, trans中转=C, dst=B
      2. 把A上剩下的一个最大盘子移动到C上(A->C)rsc=A, dst=C
      3. 把B上两个盘子,借助于A,挪到C上去, 调用递归(B-A->C)rsc=B, trans=A, dst=C
    • 当n=n时:

      1. 把A上的n-1个盘子,借助于C,移动到B上去,调用递归(A-C->B)rsc=A, trans=C, dst=B

      2. 把A上的最大一个盘子,移动到C上(A->C)rsc=A, dst=C

      3. 把B上n-1个盘子,借助于A,移动到C上, 调用递归(B-A->C)rsc=B, trans=A, dst=C

    每次都是先将其他圆盘移到辅助柱子上,再将最底下的移到C,然后再把原先柱子作为辅助柱子,重复

    代码实现

    def move(n, a, b, c):
    '''
    汉诺塔的递归实现
    n:代表几个盘子
    a:代表第一个塔,rsc
    b:代表第二个塔,trans
    c:代表第三个塔, dst
    '''
        if n == 1:
            print(a, '=>', c)
        else:
            move(n-1, a, c, b)
            print(a, '=>', c)
            move(n-1, b, a, c)
    
    醉 生 梦 死
  • 相关阅读:
    redis.conf
    redis 超全的操作
    Oracle数据库导入导出命令
    技巧总结
    C#把Object对象转换成JSON串
    vscode c++ 开发环境踩坑
    vscode python 开发环境+qgis开发
    算法设计与分析:贪心算法
    操作系统概念习题
    贪心算法:贪心选择性与优化子结构
  • 原文地址:https://www.cnblogs.com/TuerLueur/p/9514983.html
Copyright © 2020-2023  润新知