Hanoi塔問題

来源:互联网 发布:挺固防盗门 知乎 编辑:程序博客网 时间:2024/06/17 16:36
递归调

  一的函自身为递归调用。这种数称为递归。C言允递归调用。在递归调用中,又是被递归数将复调用其自身。用一次就入新的一。例如有函f如下:
int f (int x)
{
int y;
z=f(y);
return z;
}
  是一递归 但是数将无休止地用其自身,然是不正确的。了防止递归调用无止地行,在函数内递归调用的手段。常用的法是加件判足某件后就不再作递归调用,然后逐返回。下面递归调用的程。
[例5.9]用
递归n!用递归n!可用下述公式表示:
n!=1 (n=0,1)
n×(n-1)! (n>1)
按公式可
程如下:

long ff(int n)
{
long f;
if(n<0) printf("n<0,input error");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
}
程序中
出的函ff是一递归主函ff 后即入函ff行,如果n<0,n==0n=1束函行,否递归调ff自身。由于递归调用的n-1,即把n-1 值赋予形n,最后n-1值为1再作递归调用,形n1使递归终止。然后可逐退回。下面我该过程。设执行本程序时输5, 即求 5!。在主函中的句即y=ff(5)ff后,由于n=5,不等于01,故应执f=ff(n-1)*n,f=ff(5-1)*5该语ff递归调用即ff(4)。 逐次递归5.3所示。行四次递归调用后,ff取得的值变为1,故不再继续递归调用而始逐返回主ff(1)的函返回值为1ff(2)的返回值为1*2=2ff(3)的返回值为2*3=6ff(4) 的返
值为6*4=24,最后返回ff(5)24*5=120

  例5. 9也可以不用递归的方法完成。如可以用推法,即1始乘以2,再乘以3…直到n推法比递归法更容易理解和实现。但是有些问题则只能用递归算法才能实现。典型的问题Hanoi问题
  
  [5.10]Hanoi问题
板上有三根ABCA上套有64大小不等的圆盘 大的在下,小的在上。如5.4所示。要把64圆盘AC上,次只能移圆盘,移可以借助B针进行。但在任何候,任何上的圆盘都必保持大在下,小在上。求移
算法分析如下,A上有n子。
如果n=1,圆盘A直接移C。
.3
如果n=2
1.
A上的n-1(等于1)圆盘移到B上;
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上,见图5.5(b)
(2)
A上的一圆盘移到B见图5.5(c)
(3)
C上的n`-1(等于1)圆盘移到B见图5.5(d)
B.
A上的一圆盘移到C见图5.5(e)
C.
B上的n-1(等于2,令其n`)圆盘移到C(借助A)
如下:
(1)
B上的n`-1(等于1)圆盘移到A见图5.5(f)
(2)
B上的一子移到C见图5.5(g)
(3)
A上的n`-1(等于1)圆盘移到C见图5.5(h)
到此,完成了三圆盘的移动过程。
上面分析可以看出,n大于等于2程可分解

第一A上的n-1圆盘移到B上;
第二A上的一圆盘移到C上;
第三B上的n-1圆盘移到C上;其中第一和第三同的。
n=3,第一和第三又分解为类同的三,即把n`-1圆盘移到另一上,里的n`=n-1是一递归过
程,据此算法可
程如下:
move(int n,int x,int y,int z)
{
if(n==1)
printf("%c-->%c/n",x,z);
else
{
move(n-1,x,z,y);
printf("%c-->%c/n",x,z);
move(n-1,y,x,z);
}
}
main()
{
int h;
printf("/ninput number:/n");
scanf("%d",&h);
printf("the step to moving %2d diskes:/n",h);
move(h,'a','b','c');
}
move(int n,int x,int y,int z)
{
if(n==1)
printf("%-->%c/n",x,z);
else
{
move(n-1,x,z,y);
printf("%c-->%c/n",x,z);
move(n-1,y,x,z);
}
}
main()
{ ……
move(h,'a','b','c');
}
  
程序中可以看出,move函是一递归有四n,x,y,z。n表示圆盘x,y,z表示三根move 的功能是把x上的n圆盘z 上。n==1,直接把x上的圆盘移至z上,x→z。如n!=1递归调move,把n-1圆盘x移到yx→z递归调move,把n-1圆盘y移到z。在递归调程中n=n-1,故n逐次,最后n=1递归,逐返回。n=4 程序行的
input number:
4
the step to moving 4 diskes:
a→b
a→c
b→c
a→b
c→a
c→b
a→b
a→c
b→c
b→a
c→a
b→c
a→b
a→c
b→c
 在实际问题中,一据往往具有不同的。例如, 在生登表中,姓名应为字符型;学号整型或字符型;龄应为整型;性别应为字符型;成整型或型。然不能用一个数存放据。中各元素的型和度都一致,以便于编译统处理。了解问题,C言中出了另一——“于其级语言中的记录
 
原创粉丝点击