汉诺塔问题(C语言递归实现)

这篇具有很好参考价值的文章主要介绍了汉诺塔问题(C语言递归实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题分析

1.要用递归实现汉诺塔问题得先了解递归的两个必要条件

(1)存在限制条件,当满足这个条件的时候,递归将不再继续

(2)每次调用递归之后会越来越接近这个限制条件

2.汉诺塔问题用递归解决的思路

(1)假设有n个大小不一样的盘子且大盘子下面不能有小盘子,三根柱子A,B,C

(2)找到限制条件:当只需要移动的盘子只有一个时直接移动该盘子

有n个盘子在A柱,将n-1个盘子移动到B柱,将A柱上剩余的1个盘子移动到C柱

有n-1个盘子在B柱,将n-2个盘子移动到A柱,将B柱上剩余的1个盘子移动到C柱

有n-2个盘子在A柱,将n-3个盘子移动到B柱,将A柱上剩余的1个盘子移动到C柱

......

有2个盘子在A或B柱上,将1个盘子移动到B或A柱上,将A或B柱上剩余的1个盘子移动到C柱

将A或B柱上的1个盘子移动到C柱上,完成了移动

汉诺塔问题(C语言递归实现)汉诺塔问题(C语言递归实现)

 文章来源地址https://www.toymoban.com/news/detail-710741.html

二、具体代码

#include <stdio.h>
void move(char ch1, char ch2)
{
    //把一根柱子的最上面的一个盘子移到另外一根柱子的最上面
    printf("%c->%c\n", ch1, ch2);
}
void Hanoi(char a, char b, char c, int n)
{
    if (n == 1)
    {
        //当移动的盘子数量只有一个的时候直接使用move函数
        move(a, c);
    }
    else
    {
        Hanoi(a, c, b, n - 1);//A柱借助C柱将n-1个盘子移动到B柱       
        move(a, c);//将A柱剩余的一个盘子移动到C柱                    
        Hanoi(b, a, c, n - 1);//将B柱的n-1个盘子借助A柱移动到C柱     
    }
}
int main()
{
    int n;//要移动的盘子的总数
    scanf("%d", &n);
    Hanoi('A', 'B', 'C', n);//A柱借助B柱将n个盘子移到C柱上
    return 0;
}

三、运行结果

汉诺塔问题(C语言递归实现)汉诺塔问题(C语言递归实现)

 汉诺塔问题(C语言递归实现)

 

四、总结

一开始打算用数组内移动元素的方式来写,但觉得编译后的结果很难看到具体的移动过程,于是借鉴了CSDN上一位老铁的打印移动柱子的方法,并配上了汉诺塔递归最底层的逻辑思维写出来的,并且补全了具体的递归步骤

 

到了这里,关于汉诺塔问题(C语言递归实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 经典递归算法——汉诺塔问题

    经典递归算法——汉诺塔问题

             相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动

    2024年02月06日
    浏览(8)
  • 递归求解汉诺塔问题(超详解)

    递归求解汉诺塔问题(超详解)

    这个问题是关于三根柱子和一些圆盘的游戏。 初始时,所有的圆盘按照从大到小的顺序叠放在一根柱子上,目标是将所有圆盘从起始柱子移动到目标柱子上,在移动过程中,要满足以下规则喵: 每次只能移动一个圆盘。 大圆盘不能放在小圆盘上。 只能通过中间柱子作为辅

    2024年02月15日
    浏览(15)
  • 递归——汉诺塔问题(结合代码理解,终于懂了)

    递归——汉诺塔问题(结合代码理解,终于懂了)

    问题 汉诺塔问题是一个经典的递归问题,汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着 64 片圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一 根柱

    2024年02月04日
    浏览(8)
  • 递归详解,斐波那契数列、二叉树遍历、汉诺塔问题的递归代码

    一、递归详解 [1] 递归是一种编程技巧,通过函数调用自身来解决问题。递归中包含三个要素:递归定义、递归出口和递归调用。 [2] 递归定义指的是问题可以被分解为同类且更小规模的子问题。在递归过程中,问题会不断被分解为规模更小的子问题,直到达到一个基本情况,

    2024年02月08日
    浏览(8)
  • C# 使用递归方法实现汉诺塔步数计算

    C# 使用递归方法实现汉诺塔步数计算

    举一个例子:计算从 1 到 x 的总和 有三个石柱,在最左侧的石柱上从小到大摆放 N 层盘片,需要从最左侧的石柱移动到最右侧的石柱上,中间的石柱作为缓冲,一次只能移动一个盘片,且无论何时较小的盘片始终在较大的盘片上面。 这个问题求解这过程中搬运的次数 创建一

    2024年02月11日
    浏览(13)
  • 斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题

    斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题

    Write once,Runanywhere. 🔥🔥🔥 本派文章详细斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题。 💥 💥 💥 如果你觉得我的文章有帮助到你,还请【关注➕点赞➕收藏】,得到你们支持就是我最大的动力!!! 💥 💥 💥 ⚡ 版权声明:本文由【马上回来了】原创、

    2023年04月08日
    浏览(22)
  • 【汉诺塔问题分析】

    【汉诺塔问题分析】

    汉诺塔问题是一种经典的递归问题,它由法国数学家Huygens在1665年发现,也是一道有趣的数学难题。这道问题的主要目的是将三根柱子上的一堆盘子移动到另一根柱子上,移动过程中每次只能移动一个盘子,并且大盘子不能放在小盘子上面。 下面我们来详细解析这个问题:

    2024年02月16日
    浏览(6)
  • 【C语言】——递归函数,用递归简化并实现复杂问题

    【C语言】——递归函数,用递归简化并实现复杂问题

    不多废话了,直接开始。 递归是学习C语言函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的方法,在C语言中,递归就是函数调用自己。 写⼀个史上最简单的C语言递归代码: 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式

    2024年02月03日
    浏览(8)
  • 【C语言】——函数递归,用递归简化并实现复杂问题

    【C语言】——函数递归,用递归简化并实现复杂问题

    不多废话了,直接开始。 递归是学习C语言函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的方法,在C语言中,递归就是函数调用自己。 写⼀个史上最简单的C语言递归代码: 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式

    2024年02月05日
    浏览(8)
  • 【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

    【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

    本实验基于词法分析程序实现,可参考本人前面的文章。 目录 一、目标任务 二、程序功能描述 三、主要数据结构描述 四、程序结构描述 设计方法 First集和Follow集 递归子程序框图 函数定义及函数之间的调用关系 五、程序测试 测试用例1 测试结果1 测试用例2 测试结果2 测试

    2023年04月21日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包