【发布时间】:2019-12-17 23:05:04
【问题描述】:
有人能解释一下这段代码的错误在哪里吗?因为当我使用这样的参数时 a=425 b=9631 n=9876543215 我得到“退出,分段错误代码 139” :(
#include <iostream>
#include <iomanip>
using namespace std;
void ivedimas(long long &n, long long &a, long long &b);
long long fib(long long n, long long a, long long b);
void isvedimas(long long ats);
int main()
{
long long n,a,b;
ivedimas(n,a,b);
isvedimas(fib(n,a,b));
return 0;
}
void ivedimas(long long &n, long long &a, long long &b)
{
cin>>a>>b>>n;
}
long long fib(long long n,long long a, long long b)
{
long long c=b-a;
if (n==2)
return c;
return fib(n-1,b,c);
}
void isvedimas(long long ats)
{
cout<<ats<<endl;
}
【问题讨论】:
-
堆栈溢出似乎很可能。你的递归没有终止吗?
-
即使它确实最终停止递归,它也会调用自己
9876543213次!这会消耗大量的堆栈。 -
@AdrianMole:好点子!
-
我也同意,堆栈溢出可能是罪魁祸首。堆栈的大小通常为 1-8MB,因此创建
9876543213堆栈帧很可能会耗尽它,并且您会遇到分段错误。考虑切换到迭代算法。 -
使用
9876543215函数调用可能会耗尽堆栈空间并崩溃。每个递归调用都需要设置一个单独的函数堆栈。 (这就是为什么必须小心处理递归,以确保它不会重复太多次而导致空间不足)