汉诺塔问题(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 2023-10-16 04:02  不再遇见你  阅读(167)  评论(0编辑  收藏  举报