友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言程序设计-第12部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
ff(3)的返回值为2*36,ff(4)的返回值为6*424,最后返回值ff(5)为24*5120。
例8。5也可以不用递归的方法来完成。如可以用递推法,即从1开始乘以2,再乘以3…直到n。递推法比递归法更容易理解和实现。但是有些问题则只能用递归算法才能实现。典型的问题是Hanoi塔问题。
【例8。6】Hanoi塔问题
一块板上有三根针,A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。如图5。4所示。要把这64个圆盘从A针移动C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。
本题算法分析如下,设A上有n个盘子。
如果n1,则将圆盘从A直接移动到C。
如果n2,则:
1。将A上的n1(等于1)个圆盘移到B上;
2。再将A上的一个圆盘移到C上;
3。最后将B上的n1(等于1)个圆盘移到C上。
如果n3,则:
A。 将A上的n1(等于2,令其为n‘)个圆盘移到B(借助于C),步骤如下:
(1)将A上的n‘1(等于1)个圆盘移到C上。
(2)将A上的一个圆盘移到B。
(3)将C上的n‘1(等于1)个圆盘移到B。
B。 将A上的一个圆盘移到C。
C。 将B上的n1(等于2,令其为n‘)个圆盘移到C(借助A),步骤如下:
(1)将B上的n‘1(等于1)个圆盘移到A。
(2)将B上的一个盘子移到C。
(3)将A上的n‘1(等于1)个圆盘移到C。
到此,完成了三个圆盘的移动过程。
从上面分析可以看出,当n大于等于2时,移动的过程可分解为三个步骤:
第一步 把A上的n1个圆盘移到B上;
第二步 把A上的一个圆盘移到C上;
第三步 把B上的n1个圆盘移到C上;其中第一步和第三步是类同的。
当n3时,第一步和第三步又分解为类同的三步,即把n‘1个圆盘从一个针移到另一个针上,这里的n‘n1。 显然这是一个递归过程,据此算法可编程如下:
move(int n;int x;int y;int z)
{
if(n1)
printf(〃%c》%cn〃;x;z);
else
{
move(n1;x;z;y);
printf(〃%c》%cn〃;x;z);
move(n1;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');
}
《 BR》 从程序中可以看出;move函数是一个递归函数,它有四个形参n;x;y;z。n表示圆盘数,x;y;z分别表示三根针。move函数的功能是把x上的n个圆盘移动到z上。当n1时,直接把x上的圆盘移至z上,输出x→z。如n1则分为三步:递归调用move函数,把n1个圆盘从x移到y;输出x→z;递归调用move函数,把n1个圆盘从y移到z。在递归调用过程中nn1,故n的值逐次递减,最后n1时,终止递归,逐层返回。当n4 时程序运行的结果为:
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
8。7 数组作为函数参数
数组可以作为函数的参数使用,进行数据传送。数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。
1。 数组元素作函数实参
数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。例5。4说明了这种情况。
【例8。7】判别一个整数数组中各元素的值,若大于0 则输出该值,若小于等于0则输出0值。编程如下:
void nzp(int v)
{
if(v》0)
printf(〃%d 〃;v);
else
printf(〃%d 〃;0);
}
main()
{
int a'5';i;
printf(〃input 5 numbersn〃);
for(i0;i
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!