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

目录

​​​​​​​​​​​​​​前言:

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

(1)直接递归:

(2)间接递归:

第二部分函数递归的使用

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

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

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

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

✨✨题目要求:

✨✨题目解析:

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

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

✨✨题目要求:

✨✨题目解析:

✨✨答案:

题目三:斐波那契数列

✨✨题目要求:

 ✨✨题目解析:

✨✨答案: 

​​​​​​​​​​​​​​结语:


​​​​​​​​​​​​​​​​​​​​​前言:

本篇博客主要向各位小伙伴们介绍<函数递归>✨✨,带各位掌握函数基础,希望各位小伙伴们能够在这里收获到更多知识!让我们一起学习!一起进步

作者希望:由于博主水平限制,博客难免会有错误和不准之处,我也非常希望各位小伙伴能够在留言区指出。让我们一起共勉。

             最后如果觉得博主文章还不错的话,请三连支持一下哦
三个问题带你详细了解《函数递归》~【以C++为例】_第1张图片

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

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

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

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

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

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

下面看图了解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

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

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

 


​​​​​​​题目二:利用递归求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

✨答案:

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

  


题目三:斐波那契数列

✨题目要求:

斐波那契数列: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

✨答案: 

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

 

​​​​​​​​​​​​​​结语:

​​​​​​​​​​​​​​感谢各位友友能够看到这里​​​​​​​​​​​​​​

提醒友友们一句:看懂了不是懂,一定要自己实际操作哇,这样才能更好的理解和吸收。
最后来一句:一个人可以在任何他怀有无限热忱的事情上成功,让我们一起进步吧!!

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

 

你可能感兴趣的:(从零开始百天学习C++基础,c++)