三个问题带你详细了解《函数递归》~【以C++为例】

举报
在下周周ovo 发表于 2022/08/06 21:36:37 2022/08/06
【摘要】 三个问题带你详细了解《函数递归》~【以C++为例】

文章目录

🚀🚀🚀第一部分、了解函数递归(recursion)

(1)直接递归:

(2)间接递归:

🚀🚀🚀第二部分函数递归的使用

🚀🚀1、递归问题的两个必要条件

🚀🚀2、递归中的注意事项(栈溢出错误)

🚀🚀🚀第三部分、实战深入认识递归

🚀🚀题目一:利用递归求1到n的和

✨✨题目要求:

✨✨题目解析:

✨​​​​​​​✨答案:

🚀​​​​​​​🚀题目二:利用递归求n的阶乘

✨✨题目要求:

✨✨题目解析:

✨✨答案:

🚀🚀题目三:斐波那契数列

✨✨题目要求:

 ✨✨题目解析:

✨✨答案: 



🚀🚀🚀第一部分、了解函数递归(recursion)


首先让我们了解一下什么是函数递归:一个函数在执行过程中对自己的调用就称为函数的递归调用 ,任意的一个递归都可以变为循环而并不是所有循环都可以变为递归。

简而言之就是:递归就是函数自己调用自己,递归递归,有递就要有归,只递不归就会导致程序崩溃,为了避免崩溃,函数中一定有包括条件语句,在合适的时候终止递归(这也就是找出出口的过程)

              直接递归:函数在本函数内直接调用函数称为直接递归

              间接递归:如果某些函数调用其他函数,而其他函数又调用了本函数,这一过程称为间接递归 。(似乎有点难懂~~ )                  

                                                       watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Zyo5LiL5ZGo5ZGob3Zv,size_17,color_FFFFFF,t_70,g_se,x_16

下面看图了解fab104483ead4673aed60cba5edcdaa2.png编辑

(1)直接递归:

函数a()中调用函数a(),直接递归

/*直接递归*/
void a()
{
    …………

    a();     /*函数a()中调用函数a(),直接递归*/

    …………
}

(2)间接递归:

函数a()中调用函数 b(),而函数b()中又要调用函数a()这叫做间接递归

/*间接递归
void a()
{
    …………

    b();   /*函数a()中调用函数 b()*/
    …………
void b()
{
    …………

    a();   /*函数b()中又要调用函数a()这叫做间接递归*/

    …………
}

🚀🚀🚀第二部分函数递归的使用

🚀🚀1、递归问题的两个必要条件

(1)边界条件:确定递归到何时终止,也称为递归出口。
(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果

🚀🚀2、递归中的注意事项(栈溢出错误)

  • 栈溢出错误

在程序运行的时候,调用函数是有代价的,那就是要占用一片叫栈(stack)的内存空间,当调用函数时,都必须要放一些数据到栈中,当函数运行结束时这些数据就会从栈中被取出,可想而知如果调用了很多函数都不返回,栈就被塞满了新数据就没有地方放了(这种就叫作栈溢出错误),对程序运行而言,这是致命的错误,因此程序就会被强行终止(报错)

当然有解决方案了:那就是人为设置调用的次数(深度),尽量保证程序不会崩溃🤔🤔🤔


🚀🚀🚀第三部分、实战深入认识递归

 解递归问题的的步骤模板:

1、找关系(因为能写成递归的一般是有一定规律)

2、找出口

🚀🚀题目一:利用递归求1到n的和

✨✨题目要求:

利用递归求1+2+3+…n的和

✨✨题目解析:

看到这类题目我们第一想到的就是用while循环或者用for循环轻易解决,可要用递归该怎么办呢?😭

1、找关系:1--> 2--> 3 -->4 -->5 ……n  我们定义一个函数sum()来表示它的前n项和,例如:(sum(2) = 1+2,sum(6) = 1+2+……+6),     我们可以发现以下的规律:

----->>sum(n) = sum(n-1) + n

2、找出口:因为无论用户输入n最小一定是加到1,故出口我们就选择1;

----->>sum(1) = 1

✨​​​​​​​✨答案:


🚀​​​​​​​🚀题目二:利用递归求n的阶乘

✨✨题目要求:

利用递归的方法求n!

✨题目解析:

找关系:1!,2!,……n! 有什么规律呢?我们先假设函数f(n)= n!例如:(f(2)= 2!)

1、找关系:

----->>f(n)= f(n -1)* n

2、找出口:求n!就要求(n-1)!而求(n-1)!又要求(n-2)!,一直到最后变成了求0!的问题,而零的阶乘等于1故出口就找到了🥳🥳🥳

----->>f(0) = 1

✨答案:

编辑

  


🚀🚀题目三:斐波那契数列

✨题目要求:

斐波那契数列:1 , 1, 2, 3, 5 , 8, 13 ,21……

用递归法编写一个函数要求,输入n (数列中的第n项),求出n项 在斐波那契数列中对应的数。例如(输入3对应斐波那契数列中的第三项也就是2)

 ✨✨题目解析:

首先找斐波那契数列关系:这个数列从第3项开始,每一项都等于前两项之和,我们先假设一个函数f(n)=(n项对应的数)例如 (f(1) = 1,f(2) = 1,f(6) = 8)

1、找关系:

-------->>f(n)= f(n-1)+f(n -2)

2、找出口:这个题目的出口两个:因为f(n)是由两个数来确定的,如果只有一个出口那么f(n)就无法确定了,(例如2是由 1和1共同确定的)

出口一------------->>f(1) = 1

出口二------------->>f(2) = 1

✨答案: 


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。