C 实现汉诺塔递归算法(implement hannota recursive algorithm using C)

汉诺塔算法是C语言递归算法调用的一个经典算法,对学习和理解C语言的递归函数调用有一定的帮助。

 汉诺塔递归算法思路:

1. 如果只有一个盘子,那么直接从柱子1移动到柱子3

2. 如果有 >1 个盘子,那么先把 n-1 个盘子从柱子1移动到柱子2   (想要让最底下一个移动到从柱子1移动到柱子3,一定会有这一步骤,就是除了最底下的那个柱子,其他都按照顺序排列在柱子2中)

                                          再把第n个盘子从柱子1移动到柱子3

                                          最后再把n-1个盘子从柱子2移动到柱子3

代码:

 1 #include <stdio.h>
 2 
 3 int count = 1;
 4 // 因为传送过来的是字符串不是字符,所以形式参数要用char*而不是用char
 5 void hannuota(int n, char* a, char* b, char* c) {  // 盘子数,盘子原来所在柱子,借助的柱子,目的地所在柱子
 6     if (n == 1) {
 7         printf("%d: %s -> %s \n", count, a, c);  // 当n==1的时候,直接从柱子1移动到柱子3
 8         count++;
 9     }
10     else {
11         hannuota(n - 1, a, c, b);      // 第一步需要把 n-1 个盘子从 柱子1 借助 柱子3 移动到 柱子2
12         printf("%d: %s -> %s \n", count, a, c); // 第二步把 柱子1 剩下的最大的那个从 柱子1 移动到 柱子3
13         count++;
14         hannuota(n - 1, b, a, c);      // 第三步把 柱子2 中的 n-1 个盘子从 柱子2 借助 柱子1 移动到 柱子3
15     }
16 }
17 
18 int main() {
19     int n = 0;
20     printf("请输入汉诺塔的盘子数:");
21     scanf("%d", &n);
22     hannuota(n, "柱子1", "柱子2", "柱子3");
23     return 0;
24 }

运行结果:

 

这个例子中,使用递归确实把复杂的问题简化了,但是在C语言中,使用递归经常会遇到stackoverflow也就是栈溢出的问题,所以大家谨慎使用。甚至有时候使用递归会降低代码的执行效率,那么就可以使用循环代替递归来求解,递归和循环一个相似的地方就是有重复执行的代码块,但是递归的更注重:大事化小,把一个大的问题,逐步拆成小问题一个个调用,类似这类问题比如求n的阶乘这个算法也很适合使用递归方法求解,就是最后的结果是建立在之前结果的累加,或者前面的思路很清晰而后面看上去复杂了但使用的是和前面一样的思路,这两种情况就很适合用递归。这个使用递归求解汉诺塔的算法在一些大厂笔试题中是可能出现的,大家感兴趣的可以自己动手敲敲代码,实践总是有更深的感悟的~更多的大厂笔试代码就在 《剑指offer》~

 

参考资料:

https://www.bilibili.com/video/BV1Hk4y1k7KL?from=search&seid=14100432152144494715&spm_id_from=333.337.0.0

https://www.cnblogs.com/ruofengzhishang/articles/1939444.html

https://www.bilibili.com/video/BV1q54y1q79w?p=12

posted @ 2022-01-26 17:33  ttweixiao9999  阅读(1139)  评论(0编辑  收藏  举报