为什么我输入1就可以有结果显示,而输出5按道理来说输出来也是5,为什么就没显示了还是空白一行
你求斐波那契数列的fib函数里面大于2应该是return fib(n-1)+fib(n-2),后面你写成n+1了,无法结束程序
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a,b,c,k,s;
cin>>k;
a=1;b=1;
for (int i=3;i<=k;++i)
{
c=a+b;a=b;b=c;
}
cout<<b;
return 0;
}
因为想得太多了,没那个必要。
斐波那契逻辑错了哦,应该是 fib(n) = fib(n-1) + fib(n-2)
,之所以什么都没返回是因为爆栈了,连程序返回值都是非零,说明程序炸了。
错误原因是fib函数内的错误
斐波那契数列的公式为f(n)=f(n-1)+f(n-2)
你的公式为:f(n)=f(n-1)+f(n+1) 输入5时程序不动了是因为这个公式1加1减造成了死循环,程序炸了
或者说Segmentation fault(存储器区块错误)数组访问越界,链表中调用一个未分配地址的空链表单元的元素也会造成这个问题
你的程序比如在n=5时,fib函数会返回fib(4)+fib(6),而fib(6)会返回fib(5)+fib(7),而fib(7)会返回fib(6)+fib(8),以此类推,会无限制的调用,(当然你可以写一个终止条件)直到虚拟地址空间当中的栈空间被耗尽时,会发生堆、栈溢出,因而产生Segmentation fault。不过你的电脑不会那么傻,它会在空间耗尽时发出“SIGSEGV”信号结束你的程序。
正确的fib函数:
int fib(int n)
{
if (n <= 2)
//其实这里可以不用换行
return 1;
else
return fib(n - 1) + fib(n - 2);//原本为fib(n - 1) + fib(n + 1)
}
正确的完整代码为:
#include <cstdio>
#include <math.h>
int fib(int n)
{
if (n <= 2)
//其实这里可以不用换行
return 1;
else
return fib(n - 1) + fib(n +1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d", ret);
return 0;
}