函数递归那些事

什么是递归

递归就是函数自己调用自己,而递归的本质其实是一种解决问题的方法。

递归的思想

递归的思想是把复杂问题大事化小的过程。即把一个大型复杂的问题不断的拆分成与原问题相似,但规模较小的子问题,直到子问题不能被拆分,递归就结束了!

递归的限制条件

其实每一次函数调用,都会在内存的栈区上开辟一块空间,直到调用结束,这块空间才会被回收!函数如果递归层次太深或者无限的递归下去,栈空间被耗干,就会导致栈溢出的问题!

比如调试下面这段代码就会报错

复制代码
#include <stdio.h>
int i = 0;
int main()
{
	printf("%d\n", i);
	i++;
	main();
	return 0;
}

通过这段代码,我们可以发现递归的两个条件限制:

1:递归存在结束的条件,当满足这个条件的时候,递归便不再继续

2:每次递归调用之后,都越来越接近这个限制条件

如何使用

比如计算n的阶乘,这个问题就可以用递归来解决,即n的阶乘等于n乘n-1的阶乘

直接上代码

复制代码
#include <stdio.h>
int fun(int n)//递归
{
	if (n == 0)
	{
		return 1;
	}
	else
	{
		return n * fun1(n - 1);
	}
}
int main()
{
	int n = 3;//计算3的阶乘
	printf("%d! = %d\n", n, fun(n));
	return 0;
}

其中fun函数就是用来计算n的阶乘的!

该函数的执行逻辑:

1:当n==0的时候,直接返回1,可以看成是让递归结束的条件

2:当n!=0的时候,返回n乘(n-1)的值,每次调用fun函数后参数n都趋向于0

以上面这段代码举例,要计算5的阶乘,先画图

第一次调用fun函数时n==3,执行return n*fun(n-1);语句

而该语句中调用fun函数,计算n-1的阶乘(即2的阶乘)

因为n==2,所以执行return n*fun(n-1);语句

该语句中调用fun函数,计算n-1的阶乘(即1的阶乘)

因为n==1,所以执行return n*fun(n-1);语句

该语句中调用fun函数,计算n-1的阶乘(即0的阶乘)

而n==0,执行return 1;语句

然后将返回值一次带回去,最后计算结果为6

运行结果为:

递归的特点

1:递归是用少量的代码完成了大量复杂的运算

2:由于每次调用都会在内存的栈区上开辟一块空间,所以递归函数在调用的时候涉及一些运行时的开销

递归的使用场景

递归并不一定适合所有的问题,一般情况下,使用迭代(循环)的方法来解决问题的效率要更高,而只有当一个问题非常复杂,难以用迭代的方法来处理时,使用递归实现的简洁性便可以弥补它所带来的运行时开销

相关推荐
東隅已逝,桑榆非晚2 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom2 小时前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
bro_Java6663 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐3 小时前
MATLAB
开发语言·算法·matlab
叼烟扛炮3 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
careathers4 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
HUANGZHENXUAN1234 小时前
最大子矩阵和:从 O(n⁴) 到 O(n³) 的列压缩 + Kadane
c语言·前端
H.莓飛5 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla5 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
tellmewhoisi5 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法