汉诺塔问题

前言:想了很久才理解,我觉得难点就在能不能理解那个递归的调用了,一直被形参绕晕,希望大家理解这个题的时候耐心一些,递归思想需要掌握牢固以后会用得上,下面进入正题:

题目:

有一个梵塔,塔内有三个座A、B、C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上。把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上,如下图。
汉诺塔
目的就是将图一变成图二这样在这里插入图片描述
在这里插入图片描述
现在有n个盘子,将他们全部移动到C柱子上,输出移动的过程。先奉上代码:

//汉诺塔问题---递归 
#include<stdio.h>
int hnt(int n,char a , char b ,char c)
{
 if(n==1)
  printf("%c-->%c\n",a,c);
 else
 {      //刚开始都在a柱子上 
  hnt(n-1,a,c,b);  //把n-1个移动到b柱子上
  hnt(1,a,b,c);  //把a上最后一个盘子从a移动到c 
  hnt(n-1,b,a,c);  // 把n-1个盘子从b移动到c 
 }
 
} 
int main()
{
 int x;
 printf("盘子数为:");
 scanf("%d",&x);
 if(x<1)      //考虑程序健壮性时需要写上 
  printf("越界!");
 else
  hnt(x,'A','B','C');
 return 0; 
}

重点在这里

int hnt(int n,char a , char b ,char c)
{
 if(n==1)
  printf("%c-->%c\n",a,c);
 else
 {      //刚开始都在a柱子上 
  hnt(n-1,a,c,b);  //把n-1个移动到b柱子上
  hnt(1,a,b,c);  //把a上最后一个盘子从a移动到c 
  hnt(n-1,b,a,c);  // 把n-1个盘子从b移动到c 
 }

你可能会想,把n-1个移动到b上之后怎么办???

比如说现在有3个盘子,调用此函数后先执行hnt(2,a,c,b);
hnt(2,a,c,b)继续调用函数变为hnt(1,a,b,c),输出A–C;接着是调用里的第二个函数,即h(1,a,b,c)但是b,c的值刚刚已经换过,所以他表示hnt(1,a,c,b)表示从A–>B,接着是执行hnt(1,b,a,c)但是此时b,a,c意义已经改变,即hnt(1,c,a,b)表示从C–>B

int hnt(int n,char a , char b ,char c)

它是随时更新的
剩下的大家就可以一 一列举了,慢慢就领悟其中的规律了。

希望大家可以手动画一画,自然就会了,加油!
若有出错的地方,还请大佬指出,感谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值