汉诺塔问题

 


汉诺塔问题来源于印度。有三个金刚石塔,第一个从小到大摞着64片黄金圆盘,底层的圆盘大于上层。现在把圆盘按大小顺序重新摆放在最后一个塔上。并且规定,在小圆盘上不能放大圆盘,在三个塔之间一次只能移动一个圆盘。

from石塔上总共有n个圆盘,请问最少需要移动多少次才能将所有的圆盘放到to石塔?

(可以将从from拿下来的圆盘再放回去,只要小的在大的上面即可)。

汉诺塔问题_第1张图片


嗯,递归的方法,分析了大约15min搞定了:

设圆盘的个数为n,需要移动的次数为f(n)

1) n=1,  f(1) = 1;

2) n=2, f(2) = 3;

3) n=3, f(3) = 7

总结, 当n=3时,移动方案可以被拆解:

汉诺塔问题_第2张图片

由于3号圆盘是最大的,可以先忽视它的存在,第一步是将1和2号移动到buffer塔,即让3号圆盘暴露,同时流出to塔,以让3号圆盘过来, 嗯,这一过程完全等同于n=2时的情况,需要f(2)次; 

第二步是,将3号圆盘直接放到to塔;

第三步是,将buffer上的1和2号盘子,放到to塔,嗯,这一过程完全等同于n=2时候的情况,需要f(2)次。

于是乎,f(3)=f(2)+1+f(2)

于是乎, f(n) = 2* f(n-1) +1 ;  可以分解成子问题了。

 

实现:

1)实现一个递归函数,缺点是n很大时耗时;

2)写一循环:

int f(n)
{
    int res;

    if(n==1) //n>=1
        res  = 1;

    else{

       res  =1;
       for(int i=1;i

 

 

 

 

 

 

你可能感兴趣的:(软件设计师)