汉诺塔递归实现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

发布了11 篇原创文章 · 获赞 9 · 访问量 547

猜你喜欢

转载自blog.csdn.net/VistorsYan/article/details/102765478