汉诺塔问题——C语言递归

函数递归

递归其实是⼀种解决问题的⽅法,递归就是函数⾃⼰调⽤⾃⼰。

思想:
把⼀个⼤型复杂问题层层转化为⼀个与原问题相似,但规模较⼩的⼦问题来求解;直到⼦问题不能再被拆分,递归就结束了。所以递归的思考⽅式就是把⼤事化⼩,小事化了的过程。

递归递归,递就是递推的意思,归就是回归的意思。

2个必要的条件:
递归的限制条件,每次递归调⽤之后越来越接近这个限制条件。
到达限制条件后又返回

汉诺塔问题

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图)。
游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

在这里插入图片描述

输入格式:
输入在一行中给出1个正整数n。

输出格式:
输出搬动盘子过程。

输入样例:
在这里给出一组输入。例如:

3
输出样例:
在这里给出相应的输出。例如:

No.1 disk: a->c
No.2 disk: a->b
No.1 disk: c->b
No.3 disk: a->c
No.1 disk: b->a
No.2 disk: b->c
No.1 disk: a->c

一开始看到这个题目,无从下手。就先画图呗,画图还是会的。看能从一个个图中找到什么规律(思路往着递归方向)。
——————————————————————————————————————
在这里插入图片描述
——————————————————————————————————————
在这里插入图片描述
————————————————————————————————————————————
在这里插入图片描述
————————————————————————————————————————————
可以发现:

在这里插入图片描述
由此推出共有n块时的移动方法

#include<stdio.h>
void hanoi(int n, char a, char b, char c)
{
    if (n == 1)//递归条件,不断递进
    {
        printf("No.%d disk: %c->%c\n", n, a, c);//只有一块A->C
    }
    else
    {
        hanoi(n - 1, a, c, b);//n-1块从A柱借助C柱子到B柱子
        printf("No.%d disk: %c->%c\n", n, a, c);//A柱子上只有一块了,A->C
        hanoi(n - 1, b, a, c);//再把n-1块从B柱借助A柱子到C柱子
    }
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    hanoi(n, 'a', 'b', 'c');
    return 0;
}

感觉这个代码就像分析的一个总体的大概的过程,并不会深入到每一个细节,每一个细节在程序执行递归时就已经发生了。

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是无敌小恐龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值