汉诺塔问题

汉诺塔问题是运用递归和学习递归的最典型题目
问题:有一块板子上有三个钉子,A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。现在要把所有的圆盘从A针移动到C针,而且每次只能移动一个圆盘,移动可以借助b针进行,现在求移动的步骤。
思考:

1. 最大的圆盘只要保证在C针的最下边,该盘就不用考虑如何摆放了。
2. 假设有一个圆盘,可以直接将该圆盘放到C上。
3. 假设有两个圆盘:我们可以借助B指针放n-1=1个圆盘,然后将最大的圆盘放到C上, 然后 执行思考2中的步骤;
4. 假设有3个圆盘,可以考虑把上边的两个圆盘按照思考3的方式将上边的两个圆盘分别放在B,C上,现在的A可以看作是空,因为最大在下边,借组A将第二大的圆盘放在B上,然后将最大的放在C上,此时B有两个盘子,C有一个最大的。(以后也不用考虑了)相当于回归到了两个盘子的问题,就到了思考3.这样一层一层的你会发现问题又回归到了最初的放一个盘子,典型的一道递归问题;

有n个盘子,第一步:我们可以借助C针将n-1个盘子放到B上;最大的放到C针下。
第二步:我们可以借助A针将n-2个盘子放到A上,倒数第二大的盘子放到了C下;
第三步:借助B针将n-3大个盘子放到B上,依次类推,直到剩下一个盘子为止;

#include <stdio.h>
#include <stdlib.h>
void shift(char ,char ,char ,int ); 
int main(int argc, char *argv[]) {
 int n;
 char A,B,C;                       //分别代表题目中所指的A,B,C三个针; 
 printf("请输入A针上的盘子个数:"); 
 scanf("%d",&n);
 printf("盘子移动的步骤:\n");
 shift('A','B','C',n);     
 return 0;
}
void shift(char p1,char p2,char p3,int n){    //其中A,B,C均指三个指针;n代表盘子的数目; 
 if(n==1){
  printf("%c===>%c\n",p1,p3);
 }else{
  shift(p1,p3,p2,n-1);
  printf("%c===>%c\n",p1,p3);
  shift(p2,p1,p3,n-1);
 } 
} 

运行结果:
在这里插入图片描述

对于递归的学习:一定多尝试手写几次,写的多了规律潜移默化的就出来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值