超想被解答!困扰我一晚上了好难受啊

img

img

img

为什么我输入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;
}