递归有限制吗?

时间:2014-12-04 11:38:35

标签: c++

我正在测试递归,但是当我有一个超过150000个元素的数组时会出现分段错误。可能是什么问题?

#include <iostream>
using namespace std;

void init ( float a[] , long int n );

float standard ( float a[] , long int n , long int i );

int main()
{
    long int n = 1000000;

    float *a = new float[n];

    init ( a , n );
    cout.precision ( 30 );
    cout << "I got here." << endl;

    cout << "Standard sum= " << standard ( a , 0 , n - 1 ) << endl;

    delete [] a;
    return 0;

}

void init ( float a[] , long int n )
{

    for (long int  i = 0 ; i < n ; i++ )
    {
        a[i] = 1. / ( i + 1. );
    }
}

float standard ( float a[] , long int i , long int n )
{
    if ( i <= n )
        return a[i] + standard ( a , i + 1 , n );

    return 0;
}

3 个答案:

答案 0 :(得分:3)

作为对MicroVirus的扩展&#39;正确答案,这是一个算法的尾递归版本的例子:

float standard_recursion(float* a, long i, long n, long result) {
    if(i > n)
        return result;
    return standard_recursion(a, i + 1, n, result + a[i]);
}

float standard(float* a, long i, long n ) {
    return standard_recursion(a, i, n, 0);
}

如果编译器执行尾调用优化(我在g ++ -O2上测试),这应该运行。但是,由于功能取决于编译器优化,我建议完全避免深度递归并选择迭代解决方案。

答案 1 :(得分:2)

您很可能在递归函数standard中耗尽了堆栈空间,递归函数的深度为n,并且此处可能未启用尾调用优化。

所以,回答标题中的问题:是的,递归是有限制的,通常它是可用的堆栈空间。

答案 2 :(得分:0)

可能你在堆上的内存不足。此外,如果你有16位int,迭代可能会有问题。更好地使用int32_t i而不是int i。与n相同。