Hanoi塔问题递归与非递归的...

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hanoi塔问题的递归与非递归算法等价性证明

[1]递归算法:

Hanoi塔问题递归算法的简单描述如下:假设要解决的汉诺塔共有n个圆盘,对a塔上的全部n个圆盘从小到大顺序编号,最小的圆盘为1号,次之为2号,依次类推,则最下面的圆盘的编号为N。

第一步:若a塔上只有一个圆盘,即汉诺塔只有一层,则只需将这个盘从a塔上移到b塔上即可;

第二步:对于一个有n(n>1)个圆盘的汉诺塔,将n个圆盘分成两部分:上面的n-1个圆盘和最下面的n号圆盘。解决n个圆盘的汉诺塔,可以按下面的方式进行操作:

1、将a塔上面的n-1个圆盘,借助b塔,移到c塔上;

2、将a塔上剩余的n号盘子移到b塔上;

3、将c塔上的n-1个盘子,借助a塔,移到b塔上。

void hannoi(int n,int a,int b,int c)

{

if(n>0)

{

hannoi(n-1,a,c,b);

move(x,n,z) ;

hannio(n-1,c,b,a);

}

}

[2]非递归算法:

名词解释

第一类环:最小的那个圆环,就是在移动之前处在唯一有圆环的杆上最高位置的那个圆环。

第一类移动:第一类环的移动,就是第一类移动。

有用性结论

1、在实现汉诺塔移动的过程中,第一类移动和非第一类移动交替出现。

2、第一类移动在一次移动中,要移动到的位置不会是上一次第一类移动移动之前圆环的位置。换句话说,在只有三个杆的情况下,第一类移动是循环进行的。

算法思路

1、 n个圆盘的汉诺塔实现过程正好是2n步(用数学归纳法极易证明)。

2、由于第一步肯定是第一类移动,所以循环执行第奇数次时,都是第一类移动。若将三个杆分别编为a、b、c,则第一类移动是从a杆移动到c杆,则当n为奇数时,第一类移动的次序为a到

c到b再回到a的循环。当n为偶数时,第一类移动的次序为a到b 到c再回到a的循环。

3、循环执行第偶数次时,都是非第一类移动。比较三个杆的顶端的圆环,将两个顶端较大的圆环中较小的小圆环移动到顶端圆环最大的杆上即可。

实现思路

1、最外层是一个2n次循环。

2、第一类移动的实现:一、可以根据以上的结论及n和循环的次数判断从哪杆移动到哪个杆。二、可以记录第一类环的位置结合以上结论确定移动到哪个杆上。三、可以记录第一类环的位置和它前一次所在的位置,剩下的那个杆就是此次移动的目的杆。开始循环前,前一次的初始位置设置为b(n为奇数时)或c(n为偶数时)。

3、非第一类移动的实现:一、可以取出三个杆上最上层的圆环,比较出大小,将第二大的圆环移动到最大圆环所在的杆即可。

二、如果记录了第一类环的位置的话,只需取出剩余两个杆最上层的圆环,比较一次,将较小的圆环移动到较大的环所在的杆上即可。

void hannoi(int n)

{

int top[3]={0,0,0};

int **tower;

MAKE2DAray(tower,n+1,3);

int b,bb,x,y,min=0;

for(i=0;i

{

tower[i][0]=n-i+1;

tower[i][1]=n+1;

tower[i][2]=n+1;

}

top[o]=n;

b=odd(n);

bb=1;

while(top[1]

{

if(bb)

{

x=min;

if(b)

y=(x+1)%3;

else

y=(x+2)%3;

min=y;

bb=0;

}

else

{

x=(min+1)%3;

y=(min+2)%3;

bb=1;

if(tower[x][x]>tower[y][y])

Swap(x,y);

}

move(tower[top[x]][x],x+1,y+1);

tower[top[y]+1][y]=tower[top[x]][x];

tower[x]--;

tower[y]--;

}

}

[3]证明:

应用数学归纳法证明两者移动序列相同。

当n=1和n=2时容易直接验证。假设k<=n-1时,两者等价。现在考察

K=n时的情况。

将移动分为顺时针(A),逆时针(B),非最小圆盘塔尖移动(C)三种。

当n为奇数时,顺时针非递归算法产生的移动序列是A,C,A,C,…,A;

逆时针非递归算法产生的移动序列是为B,C,B,C,…,B。

当n为偶数时,顺时针非递归算法产生的移动序列是B,C,B,C,…,B;

逆时针非递归算法产生的移动序列是为A,C,A,C,…,A。

当n为奇数时,顺时针递归算法hanoi(n,A,B,C)产生的移动序列为

hanoi(n-1,A,C,B)产生的移动序列,C,hanoi(n-1,C,B,A)产生的

移动序列。由数学归纳法可知,是偶数圆盘,它们产生的移动序列均为A,C,A,C,…,A。

因此,hanoi(n,A,B,C)产生的移动序列为A,C,A,C,…,A。

当n为偶数时,顺时针递归算法hanoi(n,A,B,C)产生的移动序列为

hanoi(n-1,A,C,B)产生的移动序列,C,hanoi(n-1,C,B,A)产生的

移动序列。由数学归纳法可知,是奇数圆盘,它们产生的移动序列均为B,C,B,C,…,B。因此,hanoi(n,A,B,C)产生的移动序列为B,C,B,C,…,B。

当n为奇数和偶数时逆时针递归算法也可以类似推出。

由数学归纳法可知,递归算法和非递归算法移动序列相同。

这样,我们就证明了Hanoi塔问题的递归与非递归算法的一致性。

相关文档
最新文档