特殊Fibonacci和SIGSEGV

时间:2016-02-15 19:39:37

标签: c++ recursion fibonacci sigsegv

#include<bits/stdc++.h>
#define big 1000000007
using namespace std;
long long n,k;
int fobo(int);
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        k=fobo(n)%big;
        printf("%d",k);
        printf("\n");
    }
    return 0;
}
int fobo(int m)
{
    if(m==1)
        return 0;
    if(m==2)
        return 1;
    return 3*fobo(m-1)+2*fobo(m-2)+5;
}

上面的代码用于按照函数fobo内的递归关系中给出的关系打印特殊类型的Fibonnacci序列的和。代码在我的机器上正常工作,但在任何在线判断中进行测试时,相同的代码显示SIGSEGV错误。程序中没有使用任何数组,访问我所知道的未知内存。我想这些是出现SIGSEGV错误的一些主要要求。我在这里找不到任何东西。请帮我解决或发现错误。

1 个答案:

答案 0 :(得分:4)

如果我不得不猜测,这看起来像是堆栈溢出错误。尝试将0喂入fobo。当发生这种情况时,您的基本情况不会触发,因为两者都没有检查零。然后,您拨打fobo(-1)fobo(-2),这将启动fobo(-2)fobo(-3)fobo(-4)等格式的递归调用链,直到您最终溢出堆栈。

要解决此问题,请考虑在代码中添加0的新基本情况,或者进行常规检查以处理输入为负数的情况。

编辑:基于这些评论,我认为这里的主要问题是,如果用大输入调用此函数,在递归终止之前,您将获得堆栈溢出。要解决此问题,请考虑使用动态编程自下而上计算您的值。我怀疑这个问题最终试图解决的问题。或者,使用适合尾部呼叫消除的不同递归公式。如果您不熟悉这些技巧,请在线查看 - 您将在此过程中学到很多东西!