三个问题带你详细了解《函数递归》~【以C++为例】
文章目录
🚀🚀🚀第一部分、了解函数递归(recursion)
首先让我们了解一下什么是函数递归:一个函数在执行过程中对自己的调用就称为函数的递归调用 ,任意的一个递归都可以变为循环而并不是所有循环都可以变为递归。
简而言之就是:递归就是函数自己调用自己,递归递归,有递就要有归,只递不归就会导致程序崩溃,为了避免崩溃,函数中一定有包括条件语句,在合适的时候终止递归(这也就是找出出口的过程)
直接递归:函数在本函数内直接调用函数称为直接递归
间接递归:如果某些函数调用其他函数,而其他函数又调用了本函数,这一过程称为间接递归 。(似乎有点难懂~~ )
下面看图了解:
(1)直接递归:
函数a()中调用函数a(),直接递归
(2)间接递归:
函数a()中调用函数 b(),而函数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
✨✨答案:
- 点赞
- 收藏
- 关注作者
评论(0)