递归的优点和缺点

栈的大小是固定的,这也就意味着不能无限的递归。递归到某些时候,栈顶将会没有更多空间

来添加新的栈顶—就好像橱柜的空间被挤满,不能增加一个盘子一样

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))

递归需要做许多函数调用,每个函数调用都需要设置有一个栈帧,并传递参数,这些都增加了时间开销,而这些开销循环中没有。绝大多数情况下,现代计算机

中这些开销影响并不显著。但如果你的代码频繁执行(比如短时间内执行百万次甚至上亿次),你必须关注函数调用性能的问题

递归比循环更加强大的地方在于,递归函数维持着一个保存每次递归调用当前状态的栈,允许函数获得子问题的结果后继续处理。

递归算法:将问题分解成更小的版本的相同问题,从而解决问题。

posted @ 2015-04-15 12:26  woaijava  阅读(4663)  评论(0编辑  收藏  举报