汉诺塔,递归与 python 实现

汉诺塔问题

在三个柱子 A,B,C 中的 A 柱子上放着若干圆盘,其中下面的圆盘总比上面的圆盘大,这个规则三个柱子都必须遵循,目的是:借助三个柱子把若干圆盘都从 A 柱子上移到 C 柱子上,求解其中的步骤。

汉诺塔与递归

汉诺塔问题是一个经典的递归问题。
简单的递归理解就是在一个方法中调用它本身。
更进一步的理解,就是把一个问题持续分解为更简单的问题,直至问题小到可以解决,当然核心还是调用了它本身来解决。

汉诺塔思想

把 A 柱子上的圆盘移到 C 柱子上的步骤最终只有三个而已

  1. 把 A 柱子上的除最后一个外的所有园盘都移到 B 柱子上。
  2. 把 A 柱子上剩下的那个圆盘移到 C 柱子上。
  3. 把剩下的 B 柱子上的所有圆盘豆移到 C 柱子上。

python 实现

count = 0  # 计算总共有多少步
def hanoi(a, b, c, num):
    """
    汉诺塔
    :param a: A 柱子
    :param b: B 柱子
    :param c: C 柱子
    :param num:  圆盘个数
    :return: 
    """
    global count 
    if num == 1:  # 当剩下一个盘时,从 "A" 柱子上移到 "C" 柱子上(注意引号)
        count += 1
        print a + "->" + c
        return
    num -= 1
    hanoi(a, c, b, num)  # 第一步: 把 A 柱子上的除最后一个外的所有原盘都移到 B 柱子上。
    count += 1
    print a + "->" + c  # 第二步: 把 A 柱子上剩下的那个圆盘移到 C 柱子上。
    hanoi(b, a, c, num)  # 第三步:把剩下的 B 柱子上的所有圆盘豆移到 C 柱子上。


if __name__ == '__main__':
    hanoi("A", "B", "C", 3)
    print count

返回结果:

A->C
A->B
C->B
A->C
B->A
B->C
A->C
7

感谢阅读!
如果文章中有错误或存在误解的地方,麻烦多加指教,无比感谢!
The End.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前置文章:递归算法:www.jianshu.com/p/703069f3ba3f . 汉诺塔问题是来源于印度传...
    郎小凯阅读 789评论 0 1
  • 文章也同时在个人博客 http://kimihe.com/[http://kimihe.com/2016/12/2...
    QihuaZhou阅读 2,475评论 0 2
  • 原文链接(转载请注明出处)汉诺塔的图解递归算法 起源 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大...
    Dmego阅读 1,589评论 0 0
  • 汉诺塔算法 要想利用递归函数解决问题,一定要完成两个基本的要素:递归的终止条件,递推公式。为了分析得到递归函数,下...
    LeeLom阅读 5,613评论 7 7
  • 题目: 汉诺塔的移动可以用递归函数非常简单地实现。 请编写move(n, a, b, c)函数,它接收参数n,表示...
    快乐的杀马特阅读 470评论 0 0