☰
函数递归基础讲解
2026/10/11 6:36:41 网站建设 项目流程

今天我们来学习函数递归

什么是函数递归?

函数的递推本质就是函数自己调用自己,且作用是将一个大的问题进行拆分,俗称大事化小小事化了。
递归全称递推与回归,在递推的过程中碰到了限制条件则函数会进行回归。
注意
一定要有限制条件,不然函数会无限制的递推,没有意义
比如:

intmain(){main();return0;}

这个就是main函数自己调用自己的一个示例

我们为什么要使用函数递归?什么时候可以用函数递归?

1.函数递归方便书写,若在编译器支持良好的话我们可以在短时间内解决一个较为复杂的问题
2.函数递归相较于迭代来说会更简洁
3.问题有自相似结构
4.数学定义本身有递归性质
5.递归函数通常遵循“基例 + 归纳步骤”的结构,有助于从数学归纳法角度证明程序的正确性。只要基例成立且归纳步骤合理,整个递归过程就可被信任。

递归的示例1.求n的阶乘

我们知道,一个数的阶乘就是从一乘到这个数本身,那我们可以把n的阶乘拆分为n*(n-1)! 那n-1的阶乘也是同理,即为(n-1)*(n-2)这样就很有函数递归的特点,所以我们可以写下

intfactorial(intn){if(n<=1)// 终止条件return1;returnn*factorial(n-1);// 递推:调用自身}

以factorial(5)为例,执行过程如下:

factorial(5) = 5 * factorial(4) = 5 * 4 * factorial(3) = 5 * 4 * 3 * factorial(2) = 5 * 4 * 3 * 2 * factorial(1) = 5 * 4 * 3 * 2 * 1 = 120

递归的示例2.显示一个数的每一位数

分析:如果要显示一个数的每一位数的话,那得先有这个数,则需要用到scanf函数自定义输入一个数进去,生成之后假设这个数是1234,哪一个数更好生成?是个位的4,因为只需要1234%10即可,那可以转换成print(123)+ printf(4)注意这边的print是我自己创建的函数
那123的哪一个数字最好处理,是3,同理只需要对123取模即可。以此类推下去我们可以写出如下代码。。
我们还是以1234为例子,m的值被赋上1234之后进入函数,1234大于9,则会进行递推,123大于9,12大于9,到了1就不大于9,好的跳出这个if语句,对1取模10打印1,回归到12,取模10的2,到123取模10得3,回归到1234取模10得4 这边我们要注意每一个部分只会递归一次,绝不会在某个部分反复递归

递归的示例3.求第n个斐波那契数

什么是斐波那契数,这里要引入一个斐波那契数列,从1开始,第一个数与第二个数的和等于第三个数。
1 1 2 3 5 8 13 21 34…
我们需要求第n个斐波那契数,那第n个斐波那契数是第n-1与第n-2个斐波那契数相加得来,那同理,第n-1与第n-2个斐波那契数是由第n-2和第n-3个斐波那契数得来,那么这个思路就很符合函数递归的特点,所以可以写下
非常的好写是不是,但这个时候用递归就不合适了,因为如果我们求的数大一些比如第50个斐波那契数,中间重复计算的次数将会是天文数字。那递归不合适的话我们就得用迭代来操作了,即便递归多么多么方便,我们还是得舍弃

那迭代怎么做?

首先我们知道,斐波那契数的定义就是所谓1+2=3,那我们可以从第一个数一个一个网上加即可,
同时还得注意“第一个数”“第二个数”的位置变化,我们把第一个数假设为a,第二个数假设为b,第三个数假设为c

按这个逻辑我们可以写下
中间顺序前后上下一定不能反,因为如果先b=c那就会把a的数值赋到第三个数,会错乱。c的初始值随意但ab的初始值一定要是1.
注意我们在递归的时候一定不要动所求的变量

总结

函数递归的核心在于「自己调用自己」,通过把一个大问题拆分成与原问题结构相同、规模更小的子问题,配合明确的终止条件逐步回归求解。它让代码更简洁、更贴近数学定义,适合处理具有自相似结构的问题,如阶乘、打印每一位数、斐波那契数列等。

但递归并非万能:当子问题大量重复计算时(如求第 50 个斐波那契数),递归会产生天文数字般的冗余开销,此时应改用迭代。因此,能用递归优雅表达且不产生严重重复计算时优先递归,否则果断选择迭代。无论哪种方式,都要牢牢把握「终止条件」与「递推关系」这两个关键点。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询