首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

问,关于递归函数的有关问题

2013-12-13 
弱弱的问问,关于递归函数的问题使用递归函数的时候,函数的结果往往不能够仅仅通过调用一次函数就能够得到。

弱弱的问问,关于递归函数的问题
使用递归函数的时候,函数的结果往往不能够仅仅通过调用一次函数就能够得到。那么如果某一次调用递归函数的时候,
这个递归函数一共被调用了3次,那么这个函数中的所有的局部变量是不是都有三个版本?这些临时的版本是同时存在的吧,那么是不是就是说,如果某个递归函数的调用使得该递归函数实际上被调用了太多次,那么就可能把内存给占满?
[解决办法]
递归层次太深就会导致栈溢出(一般OS会给一个进程分配几M的栈空间)
可以改为非递归或者手动修改栈的大小
[解决办法]
每次的局部变量,都会存放在栈上,如同一系列盘子叠放在一起。
堆栈的空间是有限的,所以在内存耗尽以前,你的程序就会因为堆栈溢出而出错。
如果你想知道堆栈能放多少,可以编写下面的程序:
void foo(int x);
int Main()
{
    foo(0);
    return 0;
}
void foo(int x)
{
    //int i = 0;
    //int j = 0; //你可以打开注释看有什么不同
    cout << x << endl;
    foo(x + 1);
}
[解决办法]

引用:
Quote: 引用:

递归层次太深就会导致栈溢出(一般OS会给一个进程分配几M的栈空间)
可以改为非递归或者手动修改栈的大小


如果调用递归函数的时候,能够保证先调用非递归部分,后调用递归部分,是不是就没有这样的问题了?

如果一个程序的递归调用在它的结尾,那么实际上这是递归的特例,叫尾递归,尾递归仍然会堆栈溢出,但是尾递归可以修改为循环的形式。
void foo(int x)
{
    //int i = 0;
    //int j = 0; //你可以打开注释看有什么不同
    cout << x << endl;
    foo(x + 1);
}
其实就是尾递归,它其实就是
void foo(int x)
{
    //int i = 0;
    //int j = 0; //你可以打开注释看有什么不同
    while (1)
    {
        cout << x << endl;
        x = x + 1;
    }
}
[解决办法]
引用:
Quote: 引用:


}


有没有一种机制来针对stack overflow进行错误提示呢?

try catch可以拦截到
[解决办法]
你可以人为控制递归的层次呀. 另外如果你的程序可以优化的话,可以改成尾递归 或者直接改成循环. 在一些高可靠性的环境下,是避免用递归的.如好奇号火星车,美国宇航局使用了各种办法来确保其上代码质量。例如,递归调用是要求避免的,这是这因为C语言编译器不能保证递归堆栈不被撑破。循环要确保有终止点,这通过一个静态分析器来发现这些问题。

热点排行