汉诺塔问题python解析

汉诺塔问题python解析

  • 问题背景
  • 问题分析
        • 设想
    • python代码讲解
        • 小编说明:

问题背景

汉诺塔其实是在1883年的时候有一个法国的数学家名字叫卢卡斯发明的,不过关于这个游戏有一个传说,就是在佛教里面有一个神叫梵天,在创造世界的时候有一个圣地不是叫做贝拿勒斯在这个地方,造一个庙宇,庙宇里面有一个黄铜做的台子上面有三根宝石柱,而在其中一根宝石柱的上面梵天放了六十四个金罗盘,金罗盘上边小下边大,有一个僧侣,在不停的移动的这些金罗盘,而且移动是有规则的,规则是在移动的时候吧,我们每一次只能移动一个,而且这一个就不能放地上,你必须从一个柱子,移动到另外一柱子,不可以两个金罗盘同时移动到同一个柱上,还需要保证每次移动后每根柱子的金罗盘的顺序都是小压大,这个梵天还说,当这个僧侣把六十四个金罗盘都从最左边的柱子挪到最右边柱上的时候,世界就会在一声霹雳中毁灭所有的梵塔庙宇和僧侣也会同归于尽。

问题分析

汉诺塔问题python解析_第1张图片

设想

1.当罗盘只有一个的时候只需要把罗盘直接从A柱移动到C组一步就可以完成
2. 当罗盘只有两个的时候需要把小罗盘直接从A柱移动到B组大罗盘移动到C柱然后再将小罗盘移动到C柱三步就可以完成
3.当罗盘只有三个我只需要通过某种方法将上面的两片移动到B柱然后再将大罗盘移动到C柱上再把B柱的两个移动到C柱上去就完成了
4.当罗盘有N个的时候也是通过某种方法将上面的N-1片移动到B柱然后再将大罗盘移动到C柱上再把B柱的N-1移动到C柱上去就完成了,如果想挪N个 那就应该想怎么挪N-1个 ,如果想挪N-1个 那就应该想怎么挪N-1-1个 也以此类推 最终就会变成一个只挪一个圆盘的问题

像不像之前赵本山、宋丹丹的小品里边两个人说,把大象放冰箱里一共分为几个步骤,分为三步第一步把冰箱门,打开第二步把大象塞进去,第三步把冰箱门关上。当然,你把大象塞到冰箱的这一步很复杂,对吧,但是假如你能完成这个步骤的话,那么把大象放进冰箱里就三个步骤。这种思想、数学上叫递归:
汉诺塔问题python解析_第2张图片

我们希望能够把N层圆盘从A挪到C上去,怎么办,我可以把它分为三个步骤啊,这三个步骤分别是把 N-1 层从A挪到B,就是第一个步骤,再把第N层从A挪到C,然后再把N-1层从B挪到C,如何才能把N-1 层从A挪到B呢,又分为三步把N-2层从A挪到C,再把N层从A挪到B,然后把N-2层从C挪到B,如何实现当前的呢 继续分叉通过手算的方式是不是发现能复杂所以说汉诺塔我们在学习计算机算法时候的一个比较典型的例子

说了那么多那到底我们移动个罗盘需要多少个步骤:

1.首先我们把N层的金片步骤记作F(n)
2.如果你挪动N层罗盘的话包换两个N-1罗盘还有一个移动第N层罗盘所以他等于2xF(n-1)+1这个就是递推式
3.如果只有一个罗盘那么就是 F(1) = 1 ,如果只有两个罗盘那么就是 F(2) = 3 ,如果只有三个罗盘那么就是 F(3) = 7
可以移动的步骤可以计算为 2 n − 1 2^{n}-1 2n1

通过同时可以计算如果要计算64层需要多少步的话: 2 64 − 1 = 1.8 x 1 0 19 = 1800 亿 亿 步 2^{64}-1=1.8x10^{19}=1800亿亿步 2641=1.8x1019=1800亿亿

什么概念呢?
每年有365天,每天24小时 每小时3600秒如果你每秒钟就移动一次,大概要把全都移动完,需要多少五千八百亿年才能把它挪玩。宇宙形成到现在,也只有一百三十八亿年。而且太阳的寿命还五十亿年。其实并不需要为这个梵天把世界毁灭件事担忧,因为那应该是在宇宙毁灭之后的时啦

python代码讲解

利用分治递归思想,递归出口+调用规模变小但相同的处理方法

def Tower_of_Hanoi(n, a, b, c,):
    if n == 1:
        print(a, "-->", c)
    else:
        Tower_of_Hanoi(n - 1, a, c, b)  # 将前n-1个盘子从a移动到b
        print(a, "-->", c)  # 将最底下的最后一个盘子从a移动到c上
        Tower_of_Hanoi(n - 1, b, a, c)  # 将b上的n-1个盘子移动到c上
n = int(input('请输入汉诺塔的层数'))
Tower_of_Hanoi(n, 'a', 'b', 'c')

虽然我们已经知道了解题的公式,这段代码是为让我们更加清晰的看到过程

小编说明:

说了这么多主要是想让大家把汉诺塔这个了解的更深入一点,在平时我们研究算法的时候了解这个解题的背景,提高我们对算法的兴趣,通过一步一步的解题思路会使我们更加的将数学的公式分析演变成代码,最后学习之路还很长我们一起加油吧!

你可能感兴趣的:(python)