初识递归之汉诺塔

本文介绍了递归的基本概念及其在计算阶乘中的应用,并详细解析了经典的汉诺塔问题的递归解决方案,包括具体的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归:
链条:计算过程存在递归链条
基例: 存在一个或多个不需要再次递归的实例

简单的小例子:对于n!
例如当n=5 的时候
我们知道n=0时 n!=1,所以这个就是递归出口,我们定义一个fact(n)这个函数
def fact(n):
if n==0:
return 1
else return n*fact(n-1)

递归之汉诺塔:
规则:提供三根柱子,A、B、C,第一根柱子A上放着塔状的圆盘,经过中间柱子B到达目标柱子C,期间小圆盘只能放在大圆盘上面,并且每次只能移动一个圆盘。
步骤:我们将A柱子上的前n-1个柱子搬到B柱子,再将最后一个盘子从A搬运到C,再将前n-1个柱子从B搬运到A,即实现了从第一个圆盘A到C的操作。将前n-1个圆盘由A移动到了B
我们将n个圆盘化简为n-1,对于递归,我们只关心递归链条,即如何将n拆成n-1之间的关系,所以对n-1如何操作并不用关心它。

#include <bits/stdc++.h>

using namespace std;
void hanio(int n,char src, char dst, char mid);//分别是圆盘个数,source , destination mid
int cnt=0;//步数
int main()
{
    int number;//圆盘个数
    scanf("%d",&number);

    char A='A',B='B',C='C';

    hanio(number,A,C,B);
    printf("%d",cnt);
    return 0;
}
void hanio(int n,char src,char dst,char mid){
    if(n==1){
        printf("%d: %c -> %c\n",1,src,dst);
        cnt++;
    }
    else{
        hanio(n-1,src,mid,dst);//将前n-1个由src这个柱子通过中间柱子dst移动到目标柱子mid上
        printf("%d: %c -> %c\n",n,src,dst);//将第n个圆盘从src这个柱子移动到dst这个柱子上
        cnt++;//printf一次说明搬了一次
        hanio(n-1,mid,dst,src);//再将前n-1个由mid通过中间柱子src移动到dst目标柱子上
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值