汉诺塔递归实现c语言版

#汉诺塔问题 递归实现法

话不多说直接上代码

#include <stdio.h>
void Move(int n ,char from ,char to){
    printf("%c -> %c\n",from,to);
}
void hanoi(int n ,char from,char depend,char to){
    if (n == 1) {
        //当剩一个盘子的时候,直接移动到目的柱
        Move(1, from, to);
    }else{
        hanoi(n-1,from,to,depend);//将初始柱的前n-1个盘子借助目的塔移动到借用柱上
        Move(n,from,to);              //将剩下的一个盘子移动到目的柱上
        hanoi(n-1,depend,from,to);//将b柱n-1个盘子移动到借用a柱移动到c上
    }
}
int main() {
    int n;
    scanf("%d",&n);
    char x = 'A',y = 'B',z = 'C';
    printf("盘子移动情况如下:\n");
    hanoi(n, x, y, z);
}

思路:
不管多少个盘子(一个盘子的时候除外),全部都看作是两个盘子
即 最下面的那一个,和其上面的(n-1)个。
这样两个盘子的时候,移动就非常简单了。

总共有三步:
1.将第一个(也就是n-1)个盘子借助C柱从A柱移动到B柱。
2.将最下面的那一个盘子直接从A柱移动到C柱。
3.最后将B柱的那些(n-1)个盘子借助A柱移动到C柱。

所以在入口参数的时候需要,起始柱,借助柱(有点绕口),目的柱。

刚开始可能有些看不太懂,可以先输入几个简单的数,用断点调试,看一下他的移动过程。
递归函数的终点就是只剩一个盘子的时候,直接移动到目的柱。

如果明白了就不用看我下面的废话了

假设有64个盘子,那么问题就成了移动63和最下面的盘子。分成了两组去完成我上述说的那三步。
接着63个盘子去做第一步时就已经开始了递归。
递归到下一级时,就意味着再把63个盘子看成一个整体。分成两部分,最下面的一块和上面的62块。去完成这件事,以此类推,直到第一块。
因为只有前62块都完成移动,才可以移动到第六十三块。

不要去想着这个过程,很容易绕晕的,只需要知道这个函数的功能就是移动盘子。

***下篇博客写汉诺塔非递归算法,c语言实现。 ***

参考博客
https://blog.csdn.net/csshuke/article/details/82630311

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值