zoukankan      html  css  js  c++  java
  • Python解决汉罗塔问题(递归)

    汉罗塔问题


    汉诺塔问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

    问题解决--用递归思想


    假设塔有 n 层,从A移动到B,辅助是C。

    如果塔只有一层,直接将盘子从A移动到B:A->B

    如果塔有两层,先将小盘子从A移动到C,再将大盘子从A移动到B,最后将小盘子从C移动到B:A-> C; A->B; C->B。

    类似,如果有n层,只需要先将n-1层移动到C,再将最后一个盘子移动到B,再将n-1层从C移动到B。所以,可以归纳为以下三个步奏: 

    • hanoi(n-1,A,C,B)   #第一个参数表示层数,第二三四分别表示从A到C,辅助位B
    • A->B                    #A移动到B
    • hanoi(n-1,B,C,A)  

    Python代码

    def hanoi(n, a = 'A', b = 'B', c = 'C'):    #level = n,  A->B
        print 'level = %d' %n
        if n == 1:
            print '%d: %s -> %s' % (n,a,b)
        else:
            hanoi(n-1, a, c, b)
            print '%d: %s -> %s' % (n,a,b)
            hanoi(n-1, c, b, a)

    运行结果:

    print 'level = 1'
    hanoi(1)
    print 'level = 3'
    hanoi(3)
    --------------------------------------------------------------
    level = 1
    1: A -> B
    level = 3
    1: A -> B
    2: A -> C
    1: B -> C
    3: A -> B
    1: C -> A
    2: C -> B
    1: A -> B
  • 相关阅读:
    最大公约数
    九宫格
    Hanoi双塔问题(简单的枚举)
    最高分
    盒子
    CodeForces Round #303 Div. 2
    关于“被密码保护”的文章
    【学习】组合数的递推公式
    [FZYZOJ 1821] 一道果题
    [FZYZOJ 1889] 厨房救济
  • 原文地址:https://www.cnblogs.com/zhaoxy/p/4974938.html
Copyright © 2011-2022 走看看