我正在测试递归,但是当我有一个超过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;
}
答案 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相同。