汉诺塔是典型到不能再典型的递归问题(Recursion),其实透过这个问题本身,我们要解决的是它背后的那个boss——递归。

    关于递归,我有两句话送给大家:
        (1):不要试图跟踪递归的过程,跟着跟着,你不晕我倒立拉稀!

        (2):要写出递归,关键、核心、就是递归方程式,也就是一定要搞懂,要解决最后一步,那么前一步要干什么

    我摆上一张图,希望对大家理解递归有一定的帮助:

下载.png


参考代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>


void movePan(int n, int firstPillar, int secondPillar, int thirdPillar) {
    if (n == 1) {//如果只有一个盘子,那么直接从1号柱子转移到3号柱子即可
        printf("Move %d from %d to %d\n", n, firstPillar, thirdPillar);
    } else {
        //先把前n-1个盘子从1号柱子通过2号柱子移动到3号柱子上
        movePan(n - 1, firstPillar, thirdPillar, secondPillar);
        //然后再把n号盘子从1号柱子移动到3号柱子上
        printf("Move %d from %d to %d\n", n, firstPillar, thirdPillar);
        //再把2号柱子上的n-1个盘子通过1号柱子移动到3号柱子上
        movePan(n-1, secondPillar, firstPillar, thirdPillar);
    }
}

int main() {
    int n = 0;
    scanf("%d", &n);//圆盘个数
    int firstPillar = 1, secondPillar = 2, thirdPillar = 3;//三根柱子
    movePan(n, firstPillar, secondPillar, thirdPillar);

    return 0;
}


点赞(0)
 

0.0分

10 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

goodmoon 9月前 回复TA
为什么要标出移动过程中 通过哪个柱子 移动到的另一个柱子呢
水与火 2年前 回复TA
@GALAXY 递归啊老哥!当n>1时候它会进入递归的循环中,使用我们需要一个限制条件能跳出来实现递归,所以n-1时它会一直递归下去直到n-1=1时就会跳出来
GALAXY 3年前 回复TA
不是每次只能移动一个盘子吗,怎么自定义的函数里面移动了n-1个盘子呢