汉诺塔、反向输出问题--利用递归实现

    技术2022-07-02  62

    1.  Hanoi问题

      一块板上有A、B和C3根针。A针上套有64个大小不等的圆盘,大的在下,小的在上。要把这64个圆盘从A针移动到C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,每个镇上的圆盘都必须保持大盘在下,小盘在上,求移动的步骤。

      本算法分析如下,设A上有n个盘子。

      如果n=1,则将圆盘从A直接移动到C。

      如果n=2,则

    (1)将A上的n-1(等于1)个圆盘移动到B上;

    (2)再将A上的一个圆盘移动到C上;

    (3)最后将B上的n-1(等于1)个圆盘移动到C上。

      如果n=3,则

    (1)将A上的n-1(等于2,令其为m)个圆盘移动到B(借助于C)上,步骤如下:

    A.将A上的m-1(等于1)个圆盘移动到C上;

    B.将A上的一个圆盘移动到B上;

    C.将C上的m-1(等于1)个圆盘移动到B上;

    (2)将A上的一个圆盘移到C上;

    (3)将B上的n-1(等于2,令其为m)个圆盘移动到C(借助A)上,步骤如下:

    A.将B上m-1(等于1)个圆盘移到A上;

    B.将B上的一个圆盘移到C上;

    C.将A上的n-1(等于1)个圆盘移到C上;

    由此,完成了3个圆盘的移动过程。

    从以上分析可知,当n大于2时,移动的过程可分解为3个步骤:

    第一步 把A上的n-1个圆盘移到B上

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

    第三步 把B上的n-1个圆盘移动到C上,其中第一步和第三步的操作方法类似。

    #include<stdio.h>move(int n,int x,int y,int z){ if(n==1)  printf("%c-->%c  ",x,z); else{  move(n-1,x,z,y);  printf("%c-->%c  ",x,z);  move(n-1,y,x,z); }}main(){ int h; printf("/ninput number:/n"); scanf("%d",&h); printf("the step to moving - diskes:/n",h); move(h,'a','b','c'); printf("/n");}

    2.  反序输出问题

    反向输出一组整数

    #include<stdio.h>void reverse();main(){ printf("运行结果为:/n"); printf("输入一组整数(以0结束):/n"); reverse(); printf("/n");}void reverse(){ int n; scanf("%d",&n); if(n!=0){  reverse();  printf("%-4d",n); } else  printf("/n输出一组反序数/n");}


    最新回复(0)