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

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 %2d 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值