谭浩强 C 语言程序设计 2001 年 5 月 1 日
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 个圆盘移到 B 上;
第二步 把 A 上的一个圆盘移到 C 上;
第三步 把 B 上的 n…1 个圆盘移到 C 上;其中第一步和第三步是类同的。
当 n=3 时,第一步和第三步又分解为类同的三步,即把 n‘…1 个圆盘从一个针移到另一
个针上,这里的 n‘=n…1。 显然这是一个递归过程,据此算法可编程如下:
move(int n;int x;int y;int z)
{
if(n1)
printf(〃%c……》%cn〃;x;z);
else
{
move(n…1;x;z;y);
printf(〃%c……》%cn〃;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 函数是一个递归函数,它有四个形参 n;x;y;z。n 表示圆盘数,
x;y;z 分别表示三根针。move 函数的功能是把 x 上的 n 个圆盘移动到 z 上。当 n1 时,直
接把 x 上的圆盘移至 z 上,输出 x→z。如 n!=1 则分为三步:递归调用 move 函数,把 n…1 个
圆盘从 x 移到 y;输出 x→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
8。7 数组作为函数参数
谭浩强 C 语言程序设计 2001 年 5 月 1 日
数组可以作为函数的参数使用,进行数据传送。数组用作函数参数有两种形式,一种是
把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。
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(i=0;i
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。
赞一下
添加书签加入书架