前言

递归主要是应对与数学场景吧。
简单来说就是函数 直接或间接的调用了自己,那么这个函数就可以说时递归函数
内联函数不能作为递归函数

1
2
3
4
5
6
void hhh(){
if(...)
hhh();
else
...;
}

正文

接触最早的递归函数应该是阶乘了。
n! = 1 x 2 x 3 x 4 x…(n-1) x n

按照函数的操作,就是传递一个参数,每次乘以这个参数-1,当参数==1的时候就返回参数就行了。

1
2
3
4
int func(int x){
if (x == 1) return x;
return x * func(x - 1);
}

假设x=10

10 x func(9)
9 x func(8)
8 x func(7)
7 x func(6)
6 x func(5)

2 x 1 // x==1,return x;所以不进函数了。

递归函数用的时候一定要能结束。。。不然堆栈溢出程序也没法跑

当然你说这种操作用for循环其实还更快,都不用反复入栈了。但递归在可阅读性和逻辑上总归有益处。
要相信能活下来的总归有道理,而且设计一个递归函数难度也不小。


抛开函数调用自己,如果函数反复调用其他函数或者多个函数。

1
2
3
4
5
6
7
8
9
10
int func0(){
...
}
int func1(){
...
}
int func2(){
func1();....
}
//示意模板而已

函数之间调用进行递归,更需要注意安全。且也要保证能够被解读。不如还不如for循环。


结语

递归更加适用于树形结构的情况。
一个良好的递归函数,我们期望它每一次都更接近答案,并且能够在特定情况下终止处理。