C 如何修复SIGSEGV?(处理斐波那契数列中高达1000000的大值时出错)

C 如何修复SIGSEGV?(处理斐波那契数列中高达1000000的大值时出错),c,fibonacci,segmentation-fault,C,Fibonacci,Segmentation Fault,试图开发一个快速查找斐波那契值的代码。 但问题是当输入的顺序为1000000时,我得到了SIGSEGV错误。 另外,从这里的其他问题中,我了解到这可能是因为堆栈内存在运行时超过了限制。我想这里就是这样 #include<stdio.h> unsigned long long int a[1000001] = {0}; unsigned long long int fib(int n) { unsigned long long int y; if(n==1 || n==

试图开发一个快速查找斐波那契值的代码。 但问题是当输入的顺序为1000000时,我得到了SIGSEGV错误。 另外,从这里的其他问题中,我了解到这可能是因为堆栈内存在运行时超过了限制。我想这里就是这样

#include<stdio.h>
unsigned long long int a[1000001] = {0};
unsigned long long int fib(int n)
{
    unsigned long long int y;
    if(n==1 || n==0)
        return n;
    if (a[n] != 0)
        return a[n];
    else
    {
      y=fib(n-1)+fib(n-2);
      a[n] = y;
    }
    return y;
}
main()
{
    int N;
    unsigned long long int ans;
    a[0] = 1;
    a[1] = 1;
    scanf(" %d",&N);
    ans = fib(N+1);
    printf("%llu",ans);
}
#包括
无符号长整型a[1000001]={0};
无符号长整型fib(整型n)
{
无符号长整型;
如果(n==1 | | n==0)
返回n;
如果(a[n]!=0)
返回一个[n];
其他的
{
y=fib(n-1)+fib(n-2);
a[n]=y;
}
返回y;
}
main()
{
int N;
无符号长整型;
a[0]=1;
a[1]=1;
scanf(“%d”和“&N”);
ans=fib(N+1);
printf(“%llu”,ans);
}

如何修复输入值为1000000的代码?

使用您自己的变量来跟踪状态,而不是使用堆栈。本质上,使用您自己的代码执行函数调用和返回


最好的方法就是把算法完全转换成一个高效的算法。例如,要计算fib(6),您的代码计算fib(4)两次,一次在fib(5)请求时,一次在fib(6)请求时。

使用您自己的变量跟踪状态,而不是使用堆栈。本质上,使用您自己的代码执行函数调用和返回

最好的方法就是把算法完全转换成一个高效的算法。例如,要计算fib(6),您的代码将计算fib(4)两次,一次在fib(5)询问时计算,一次在fib(6)询问时计算。

这里有一个更好的方法(仍然可以显著改进)可以为您计算Fibonacci数:

unsigned long long Fibonacci(int n)
{ 
    unsigned long long last[2] = { 0, 1 }; // the start of our sequence

    if(n == 0)
        return 0;

    for(int i = 2; i <= n; i++)
        last[i % 2] = last[0] + last[1];

    return last[n % 2];
}
无符号长斐波那契(int n)
{ 
无符号long last[2]={0,1};//序列的开始
如果(n==0)
返回0;
对于(int i=2;i,这里有一个更好的方法(仍然可以显著改进)可以为您计算斐波那契数:

unsigned long long Fibonacci(int n)
{ 
    unsigned long long last[2] = { 0, 1 }; // the start of our sequence

    if(n == 0)
        return 0;

    for(int i = 2; i <= n; i++)
        last[i % 2] = last[0] + last[1];

    return last[n % 2];
}
无符号长斐波那契(int n)
{ 
无符号long last[2]={0,1};//序列的开始
如果(n==0)
返回0;

对于(int i=2;我让它迭代,让它迭代。