我发现我的代码仅适用于 n <= 43429。如果为 n>43429,则会导致分段错误。我是否错了数据类型或其他什么?
这是我的代码和调试结果: 在此处输入图像描述
#include<stdio.h>
#include<windows.h>
double recursive(long n);
int main(){
printf("nEnter n:");
long n; scanf("%ld", &n);
printf("n%.2lf", recursive(n));
getch();
return 0;
}
double recursive(long n){
if(n<=1) return 1;
else return (double)1/n + recursive(n-1);
}
每个递归调用都需要调用堆栈上的空间(通常称为"堆栈"(。堆栈具有固定的最大大小。如果用完堆栈中的所有空间,程序将崩溃。您的操作系统和/或编译器默认使堆栈足够大,以便进行 43429 次递归调用,但不会更多。
通常有一种方法可以为堆栈请求更多空间,但不能从程序内部请求。在 Windows 上,您可以在"模块 .def 文件"中指定所需的大小。我不熟悉您正在使用的IDE,但这应该转换为项目配置中某处的旋钮。
或者,这将是学习如何将递归转换为迭代的好时机。你的程序几乎是尾递归的,所以这是一个简单的案例。
我不知道您是如何设法让 Windows 使用短语"分段错误"报告此崩溃的,但现在这并不重要。