hanno/汉诺塔问题 的python算法(递归思想)

汉诺塔问题的python算法

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

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

Hanno的python算法使用的是递归的思想.

首先了解一下递归的思想:
  一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
  递归由递归段和基例构成,递归段负责循环,直到抵达基例,然后返回到原问题。
  
现在回到问题,Hanno塔是如何使用递归思想的。
  将Hanno塔上三根柱子分别命名为A,B,C。设A上有n个盘子,
  如果n=1则直接将这一个圆盘从A移动到C即可(基例)。
  如n>=2,则分为三步,把n-1盘从A移动到B,把A上n盘(最后一个盘)移动到C,此时只需要把B上的n-1盘移动到C(递归)。
  在递归调用过程中n的值逐渐递减,最后n=1,达到临界条件,终止递归,逐级返回。

好了,现在上代码:

def hanno(n,a="A",b="B",c="C"):
    if n==1:#基例
        sum+=1
        print("%d:%s->%s"%(n,a,c))# %d代表的n是盘子的编号.
    else:#递归
        hanno(n-1,a,c,b)
        sum+=1
        print("%d:%s->%s"%(n,a,c))
        hanno(n-1,b,a,c)

n=int(input())
sum=0
hanno(n)
print(sum)#总移动次数

用数学方法计算:
假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。

现在回到开头的神话故事,当金片数为64时,
f(n)=2**64-1=18446744073709551615

假如每秒钟一次,共需多长时间呢?平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,这表明移完这些金片需要5845.54亿年以上,真过5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

这么说来,印度神话可没有骗人呢!(笑)

你可能感兴趣的:(hanno/汉诺塔问题 的python算法(递归思想))