递归是否有限制
Is there limitation for recursion?
>我正在测试递归,但是当我有一个超过 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 相同。
相关文章:
- 在程序变得低效之前,允许多少新的[]和删除[]分配是否有限制?
- 对同一文件使用 .read 的次数是否有限制?
- 有条件的打印和计数在 std::map 上有限制
- arduino count++ 是否有限制以及如何修复它?
- 创建的事件数量是否有限制?
- 在SFML中,时钟有限制吗?
- 自我分配有用时是否存在情况
- 在mbed中打开的wav文件数量是否有限制
- C++中无序集的大小是否有限制
- 是否对在另一个Linux发行版中使用G 编译的可执行文件有限制
- 这个程序有限制吗?
- std::set::迭代器的大小有限制吗
- std::copy的限制是否比std::memcopy更宽松?
- 递归是否有限制
- 可以在 CUDA 中使用的数组大小是否有限制
- 使用 SB_SETTEXT 的状态栏中显示的字符数是否有限制
- 在matlab上生成有限制的随机向量时出现问题
- Q设置:.ini文件的行长度有限制吗
- c++中标识符名称的长度是否有限制?
- 是否有限制模板的习惯用法/设计模式?