汉诺塔问题(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柱上,完成了移动

 

二、具体代码

复制代码
#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;
}
复制代码

三、运行结果

 

 

四、总结

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

 

posted on   不再遇见你  阅读(265)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示