递归的优点和缺点
栈的大小是固定的,这也就意味着不能无限的递归。递归到某些时候,栈顶将会没有更多空间
来添加新的栈顶—就好像橱柜的空间被挤满,不能增加一个盘子一样
void recurse() { recurse(); //函数调用其自身 } int main() { recurse();//开始递归 } //最终 栈空间会消耗一空,程序将因栈溢出而崩溃
函数相互递归,以阶乘为例:
int factorial_odd (int x) { if(x == 0) { return 1; } return factorial_even(x-1); } int factorial_even(int x) { if(x == 0) { return 1; } return factorial(x-1); } int factorial(int x) { if(x%2==0) { return factorial_even(x); } else { return factorial_odd(x); } } //基线条件没有防负数输入 ,即使调用factorial(-1)会导致这样的 //调用栈 factorial(-1000))
递归需要做许多函数调用,每个函数调用都需要设置有一个栈帧,并传递参数,这些都增加了时间开销,而这些开销循环中没有。绝大多数情况下,现代计算机
中这些开销影响并不显著。但如果你的代码频繁执行(比如短时间内执行百万次甚至上亿次),你必须关注函数调用性能的问题
递归比循环更加强大的地方在于,递归函数维持着一个保存每次递归调用当前状态的栈,允许函数获得子问题的结果后继续处理。
递归算法:将问题分解成更小的版本的相同问题,从而解决问题。