递归算法学习———汉诺塔

来源:互联网 发布:caxa机械制图软件 编辑:程序博客网 时间:2024/06/05 04:23

由来:

汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。
假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,f(64)= 2^64-1=18446744073709551615

算法分析:

我们可以先分析盘子比较少的情况。假定盘子从大向小依次为:盘子1,盘子2,...,盘子64。
如果n=1,则将圆盘从A直接移动到C。
如果n=2,则:
(1)将A上的n-1(等于1)个圆盘移到B上(借助于C);
(2)再将A上的一个圆盘移到C上;
(3)最后将B上的n-1(等于1)个圆盘移到C上。
如果n=3,则:
A)将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),步骤如下:
(1)将A上的n`-1(等于1)个圆盘移到C上。
(2)将A上的一个圆盘移到B。
(3)将C上的n`-1(等于1)个圆盘移到B。
B)将A上的一个圆盘移到C。
C)将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),步骤如下:
(1)将B上的n`-1(等于1)个圆盘移到A。
(2)将B上的一个盘子移到C。
(3)将A上的n`-1(等于1)个圆盘移到C。到此,完成了三个圆盘的移动过程。

从上面分析可以看出,当n大于等于2时, 移动的过程可分解为三个步骤:

第一步 把A上的n-1个圆盘通过辅助C移到B上;

hanoi(n-1,A,C,B)

第二步 把A上的一个圆盘移到C上;

 printf("Move disk %d from %c to %c\n",n,A,C)

第三步 把B上的n-1个圆盘通过辅助A移到C上;

hanoi(n-1,B,A,C)
实现如下:


#include<stdio.h>void hanoi(int n,char A,char B,char C){if(n==1){  printf("Move disk %d from %c to %c\n",n,A,C);}else{  hanoi(n-1,A,C,B);  printf("Move disk %d from %c to %c\n",n,A,C);  hanoi(n-1,B,A,C);}}main(){int n;printf("请输入数字n以解决n阶汉诺塔问题:\n");scanf("%d",&n);hanoi(n,'A','B','C');}

原创粉丝点击