汉诺塔递归函数的代码解析

 

对于汉诺塔游戏在这我不多阐述了。

我们直接进入正题,我把汉诺塔三根柱子命名为“起点柱”、“过度点柱”、“终点柱”。

c9be07cb5f694084a954a1cd1036f45f.jpg

 这个游戏可以分为两个板块,一个是盘子个数b=1时,二是盘子个数n>1时。

当盘子个数n=1时,我们可以将处于起点柱的盘子直接移动到终点柱,即可完成任务。

当盘子个数n>1时,我们只需要将最大的盘子(最底下的盘子,此后命名为max盘)和大盘子以上的盘子看做是两个不同的整体。即max盘为一个单独整体,max盘以上的所有盘子看做是一个大整体。

无论是多少个盘子(n>1),max盘以上的所有整体都始终会在过度点柱停留,并且在max盘以上的所有整体在过度点停留时,max盘没移动到终点时,max盘始终存在于起点柱。

等max盘移动到终点柱后,我们可以将max盘看做于底座合体了,我们就可以不看起初的max盘,那原来的max盘以上的所有盘子都处于原来的过度点柱上,那我们可以将这个原来的过度点柱,看做是新的起点柱子,而原来的max盘所在处仍然为终点柱,而原来的起点柱便可以被看成后来的过度点柱。如此重复这个过程。便可使得所有的盘子都从起初的起点柱移动到了终点柱。

变换成c代码。

#include<stdio.h>

void hanoi(int num, char c, char z, char h)

//void表示该函数无返回值

{

 if (num == 1)

  printf("%c->%c\n", c, h);

 //%c->%c的意思是,将c柱(当前起点柱)最上面的盘子移动到h柱(当前终点柱)上

 else

 {

  hanoi(num - 1, c, h, z);

  printf("%c->%c\n", c, h);

  hanoi(num - 1, z, c, h);

  //此时num-1个盘子处于z盘上,也就是原来的过度点柱上,现在我们可以

  //将原来的过度点柱子也就是现在num-1盘子所在的柱子看作成新的起点柱

  //那原来的起点柱就变成了现在的过度点柱。再用原来的思路如此往复即可

 }

}

 

 

int main() {

 int n = 0;

 int a = 0;

 scanf_s("%d", &n);

 hanoi(n, 'A', 'B', 'C');//输入的值为三根柱子的name。

 a = 2 * n - 1;//计算步骤。公式是通过前几次的列举得到的。

 printf("一共需要%d个步骤才能完成", a);

 return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值