1.函数递归
1.1 什么是递归?
函数直接或者间接的调用自己的技巧
简言之,大事化小
- 实例1
```c++
int main()
{
printf("hehe");
main();
return 0;
} // 会陷入死循环,死递归### 1.2 递归条件 ==递归的两个条件(递归的必要条件,缺一不可)==
- 存在限制条件,当满足限制条件的时候,递归停止
- 每次递归调用后要逐渐接近这个限制条件
1.3 递归的异常
当出现 stack overflow 表示栈溢出,每次函数调用都会分配一个空间
死递归必定栈溢出!
递归层次不能太深!
- 实例二(满足两个必要条件但出现了栈溢出)
```c++
//递归层次过深,出现栈溢出
void test(int i)
{
if (i < 10000)
{
test(i + 1);
}
}
int main()
{
test(1);
return 0;
}
![](%E5%87%BD%E6%95%B0%EF%BC%88%E4%BA%8C%EF%BC%89_md_files/08134ce0-0fa0-11ed-b397-bd9e2ee5cf57.jpeg?v=1&type=image)
3. 实例三
```c++
//模拟实现strlen函数
int my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[20] = "lucool";
printf("%d", my_strlen(arr));
return 0;
}
- 实例4
```c++
//实现n的阶乘
int Fac(int n)
{
if(n > 1)
{
return n * Fac(n - 1);
}
return 1;
}
int main()
{
int n = 10;
int fac = 0;
fac = Fac(n);
printf("%d", fac);
return 0;
}
5. 实例5
```c++
//斐波那契数列 -- 调用次数过多,导致运行效率低下
1. 递归实现 -- 效率较低
int Fab(int n)
{
if (n > 2)
return Fab(n - 1) + Fab(n - 2);
else
return 1;
}
int main()
{
int n = 10;
int fab = 0;
fab = Fab(n);
printf("%d\n", fab);
return 0;
}