《c语言设计》

下载本书

添加书签

c语言设计- 第15部分


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!

谭浩强      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] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架