目录
前言:
第一部分、了解函数递归(recursion)
(1)直接递归:
(2)间接递归:
第二部分函数递归的使用
1、递归问题的两个必要条件
2、递归中的注意事项(栈溢出错误)
第三部分、实战深入认识递归
题目一:利用递归求1到n的和
✨✨题目要求:
✨✨题目解析:
✨✨答案:
题目二:利用递归求n的阶乘
✨✨题目要求:
✨✨题目解析:
✨✨答案:
题目三:斐波那契数列
✨✨题目要求:
✨✨题目解析:
✨✨答案:
结语:
本篇博客主要向各位小伙伴们介绍<函数递归>✨✨,带各位掌握函数基础,希望各位小伙伴们能够在这里收获到更多知识!让我们一起学习!一起进步
作者希望:由于博主水平限制,博客难免会有错误和不准之处,我也非常希望各位小伙伴能够在留言区指出。让我们一起共勉。
首先让我们了解一下什么是函数递归:一个函数在执行过程中对自己的调用就称为函数的递归调用 ,任意的一个递归都可以变为循环而并不是所有循环都可以变为递归。
简而言之就是:递归就是函数自己调用自己,递归递归,有递就要有归,只递不归就会导致程序崩溃,为了避免崩溃,函数中一定有包括条件语句,在合适的时候终止递归(这也就是找出出口的过程)
直接递归:函数在本函数内直接调用函数称为直接递归
间接递归:如果某些函数调用其他函数,而其他函数又调用了本函数,这一过程称为间接递归 。(似乎有点难懂~~ )
函数a()中调用函数a(),直接递归
/*直接递归*/
void a()
{
…………
a(); /*函数a()中调用函数a(),直接递归*/
…………
}
函数a()中调用函数 b(),而函数b()中又要调用函数a()这叫做间接递归
/*间接递归
void a()
{
…………
b(); /*函数a()中调用函数 b()*/
…………
void b()
{
…………
a(); /*函数b()中又要调用函数a()这叫做间接递归*/
…………
}
(1)边界条件:确定递归到何时终止,也称为递归出口。
(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果
在程序运行的时候,调用函数是有代价的,那就是要占用一片叫栈(stack)的内存空间,当调用函数时,都必须要放一些数据到栈中,当函数运行结束时这些数据就会从栈中被取出,可想而知如果调用了很多函数都不返回,栈就被塞满了新数据就没有地方放了(这种就叫作栈溢出错误),对程序运行而言,这是致命的错误,因此程序就会被强行终止(报错)
当然有解决方案了:那就是人为设置调用的次数(深度),尽量保证程序不会崩溃
解递归问题的的步骤模板:
1、找关系(因为能写成递归的一般是有一定规律)
2、找出口
利用递归求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!
找关系: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
感谢各位友友能够看到这里:
提醒友友们一句:看懂了不是懂,一定要自己实际操作哇,这样才能更好的理解和吸收。
最后来一句:一个人可以在任何他怀有无限热忱的事情上成功,让我们一起进步吧!!