递归
1.什么是递归?
递归就是函数或过程在其定义或声明的中有直接或间接调用自身的一种方式。他通常将一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
2.递归的主要思想:大事化小
求第n个斐波那契数(不考虑溢出)
int fib(int n)
{
if (n <= 2)
return 1;
return fib(n-1) + fib(n - 2);
}
求n的阶乘:
int factorial(int n)
{
if (n <= 1)
return 1;
else
return n*factorial(n - 1);
}
不允许建立临时变量,求字符串长度
int my_strlen(char* str)
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
3.递归的俩个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不在继续(递归要有出口)
- 每次递归之后越来越接近这个限制条件
4.递归的缺点
- 系统分配给程序的栈空间是有限的,单数如果出现了死循环,死递归等问题,就可能导致一直开辟空间,最终产生栈空间耗尽的情况,这样的现象我们叫做栈溢出
- 递归虽然使程序的可读性强,思维逻辑更清晰,但其效率低
5.如何解决上述问题:
- 将程序由递归改为非递归
- 在递归内部使用static(栈对象)对象代替非static局部变量(栈对象),这样就不用频繁的去申请和释放栈空间
- 建议使用第一种方法
可变参数列表</