关于递归应用的经典题:汉诺塔问题(以及对递归的理解)

题目要求:

有三个圆柱A、B、C,初始时A上有N个圆盘,N由用户输入给出,最终移动到圆柱C上。

每次移动步骤的表达方式示例如下:[STEP 10] A->C。其中,STEP是步骤序号,宽度为4个字符,右对齐。

请编写代码,获得输入N后,输出汉诺塔移动的步骤。

输入格式

N

输出格式

移动步骤

样例输入

3

样例输出

[STEP 1] A->C

[STEP 2] A->B

[STEP 3] C->B

[STEP 4] A->C

[STEP 5] B->A

[STEP 6] B->C

[STEP 7] A->C

代码:

#include <iostream>
using namespace std;

void hanrot(int n, char A, char B, char C,int &i);    //声明汉诺塔函数

void process(int n);    声明过程函数

int main()    //主函数

{

int n;    //用于输入圆盘数量

cin >> n;    

process(n);    //调用 过程函数

}


void hanrot(int n, char A, char B, char C, int& i)    //汉诺塔函数的定义

{
    //基准  递归终止的条件
    if (n == 1)

    {
        
        printf("[STEP %d] %c->%c\n", i, A, C);
    
        i++;

    }

    //递归调用
    else

    {

        hanrot(n - 1, A, C, B, i);

        printf("[STEP %d] %c->%c\n", i, A, C);
    
        i++;
    
        hanrot(n - 1, B, A, C, i);

    }

}


void process(int n)        //用于给汉诺塔函数传参数

{

int i = 1;

char a = 'A', b = 'B', c = 'C';

hanrot(n, a, b, c, i);

}

如何编写递归函数:

我在这里举例两个例子:

例一:阶乘问题的递归

当n=1时,f(n) = 1,其他情况f(n) = f(n-1) * n。对应的代码如下:

例二:斐波那契数列

当n <= 2时,结果是1,否则,f(n) = f(n-1) + f(n-2)。对应代码如下:

第一步:确定问题

就是递归函数的参数:

阶乘问题是求n的阶乘 , 斐波那契问题是求第n个数,汉诺塔问题是将n个与那盘从A通过B移动到C

第二步:解决基准问题

就是参数符合什么条件时,可以直接计算结果并返回:

阶乘问题当n = 1时,答案是1。斐波那契问题当n <= 2时,答案是1。汉诺塔问题当n = 1时,直接从A移动到C

第三步:确定问题如何拆解

寻找通过规模更小的子问题来解决当前问题

就是将参数变得更接近基准问题:

阶乘问题可以拆解成 n-1,斐波那契问题可以拆解还曾 n-1 和 n-1,汉诺塔问题拆解成 n-1个圆盘从A移动到B在移动到C和从B移动到C。

思路来源:

b站主播:NotOnlySuccess 其UID为:3546647317448859

超级厉害的一个up主,感兴趣的可以去看他的视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值