花露水和暖壶


私信TA

用户名:MichaelMeng

访问量:9973

签 名:

等  级
排  名 86
经  验 9293
参赛次数 0
文章发表 28
年  龄 0
在职情况 学生
学  校 烟台大学
专  业

  自我简介:

不喜欢摇滚乐的研究生不是好程序猿!

    汉诺塔是典型到不能再典型的递归问题(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分

13 人评分

  评论区

为什么要标出移动过程中 通过哪个柱子 移动到的另一个柱子呢
2024-03-31 22:52:38
不是每次只能移动一个盘子吗,怎么自定义的函数里面移动了n-1个盘子呢
2021-11-26 16:50:24
  • «
  • 1
  • »