利用函数递归解决汉诺塔问题(附上代码易懂)

前言:🍀🍀🍀

我们在学习递归的时候,汉诺塔问题是我们一个十分经典的例题,相信大家在学习过程中都遇到过,这篇文章希望和大家一起彻底解决汉诺塔问题,以后遇到相关问题,我们就非常之熟练,在解决汉诺塔问题之前我们要知道什么是汉诺塔!

首先要了解什么时汉诺塔?

汉诺塔(Tower of Hanoi),又称河内塔。源自印度古老传说的一个游戏,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘!!

用我们简单来说就是:如上图,我们在A这个柱子上假设放n个盘子,通过ABC这三个柱子将盘子进行移动,最终将A上所有的盘子从大到小依次放在C柱子上(需要注意的是:我们在进行移动过程中,盘子大的始终在盘子小的之下)🌟🌟🌟


有了对汉诺塔问题清晰的了解后,接下来我们去分析汉诺塔问题如何用代码去实现!!!

首先,我们要解决代码,第一就是要将代码思路想出来:

汉诺塔问题思路:

当我们盘子个数是一个时,那我们直接就可以将盘子从A移动到C上(A->C);

当我们的盘子是两个的时候,我们能够很快将盘子从A上转换到C上,如下图分析:

这是两个盘子的分析,三个盘子的分析也如同一样的,那么如果是n个盘子呢?这个思路又是怎样的

这个时候我们需要灵活运用到递归思想

第一步我们肯定是A通过借助C柱子将n-1个盘子放在B上,再将第n这个盘子放在C上

接着,B柱子上的盘子借助C这个柱子将n-2个盘子放在A上,再将第n-1这个盘子放在C上

依次类推,最终将所有的盘子放在C上:

代码如下:(包含注释)🌸

#include<stdio.h>

int count = 0;//通过全局变量进行判断一共需要移动多少次盘子

void move(int n, char A, char C)
{
    count++;//移动一次加一次
    printf("将第%d个盘子从%c->%c\n", n, A, C);
    return count;

}

void hanoi(int n, char A, char B, char C)
{
    if (n == 1)
    {
        move(n,A, C);//通过调用一个函数进行移动,将A上唯一个盘子移动到C上

        //printf("%c->%c", A, C);也可以直接打印出来

    }
    else
    {
        hanoi(n - 1, A, C, B);//通过C进行辅助,最终将A上的n-1个盘子放在B上

        move(n,A, C);//通过调用一个函数进行移动,将A上最后一个盘子n移动到C上
        //printf("%c->%c", A, C);

        hanoi(n - 1, B, A, C);//最后将B上的n-1个盘子通过A辅助全部放在C上
    }
}

int main()
{
    int n = 0;
    printf("请输入移动盘子个数:\n");

    //输入n个盘子
    scanf("%d", &n);

    hanoi(n, 'A', 'B', 'C');//通过ABC三个柱子进行移动

    printf("一共移动多少次盘子:%d\n", count);

    return 0;

}

这里我加了一个全局变量count,进行判断我们一共移动了多少次盘子。😽😽😽


大家有什么疑问或者我们写好的地方欢迎留言😁😁,觉得博主写的还阔以的点点关注和赞👍👍和收藏

🌟🌟

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值