#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错误的一些主要要求。我在这里找不到任何东西。请帮我解决或发现错误。
答案 0 :(得分:4)
如果我不得不猜测,这看起来像是堆栈溢出错误。尝试将0喂入fobo
。当发生这种情况时,您的基本情况不会触发,因为两者都没有检查零。然后,您拨打fobo(-1)
和fobo(-2)
,这将启动fobo(-2)
,fobo(-3)
,fobo(-4)
等格式的递归调用链,直到您最终溢出堆栈。
要解决此问题,请考虑在代码中添加0的新基本情况,或者进行常规检查以处理输入为负数的情况。
编辑:基于这些评论,我认为这里的主要问题是,如果用大输入调用此函数,在递归终止之前,您将获得堆栈溢出。要解决此问题,请考虑使用动态编程自下而上计算您的值。我怀疑这个问题最终试图解决的问题。或者,使用适合尾部呼叫消除的不同递归公式。如果您不熟悉这些技巧,请在线查看 - 您将在此过程中学到很多东西!