递归是否有限制

Is there limitation for recursion?

本文关键字:有限制 是否 递归      更新时间:2023-10-16

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

作为对 MicroVirus 正确答案的扩展,以下是您的算法的尾递归版本示例:

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 上进行了测试)。但是,由于功能取决于编译器优化,因此我建议完全避免深度递归并选择迭代解决方案。

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

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

可能是堆内存不足。此外,如果你得到 16 位 int,则迭代可能存在问题。最好使用 int32_t i 而不是 int i。与 n 相同。