Fibonacci的c++代码出现segmentation fault 5C

我写了一个Fibonacci 的c++ 代码在linux 上运行 ./hw1 出现 segmentation 但是运行./hw1 10 可以运行
代码如下

#include <iostream>
using namespace std;

long int Fibonacci (int N) {
if (N<=1){
return N;
}
else{
return Fibonacci(N-1)+Fibonacci(N-2);
 }
}

int main  (int argc, char *argv[]) {
int input =atoi(argv[1]);
long int Result = Fibonacci(input);
cout<<"enter the Fibonacci number:"<<input<<" The result is:"<<Result<<endl;
}

出现的问题如图

3个回答

你的程序使用参数传入input,看你程序运行的时候有没有传入参数。
还有就是数字是不是很大,因为Fibonacci会随着项数迅速增长,输入过大的参数会溢出。

运行这个 ./hw1时候argv[1]第二个参数为空,你用它就会段错误。
你应该添加代码判断的;
举个例子:

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
   if(argc != 2)
   {
       printf("Usage:%s <int>\n",argv[0]);
       exit(-1);
   }
   int input = atoi(argv[1]);
   printf("Hellow World!\n");
   return 0;
}

费波那契数列Fibonacci 不要用递归计算, 递归会造成函数呈现2^n次方的展开调用,比如60,就是2的60次方的函数调用,
造成cpu的segmentation fault错误. 所以直接使用循环计算就可以了. 还有使用64bit的的整数单位int64_t或者long long.
不然很快就会超过int的32bit上限

// test-c11.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stdint.h>
using namespace std;
class A
{
    int a, b;
public:
    A(int i, int j) :a(i), b(j) { cout << "constructor" << endl; }
    A(A& a1) 
    {
        a = a1.a;
        b = a1.b;
        cout << "copy constructor" << endl;
    }
    ~A() { cout << "destructor" << endl; }
};

inline int Fibonacci(int N) 
{
    if (N <= 1) {
        return N;
    }
    else {
        return Fibonacci(N - 1) + Fibonacci(N - 2);
    }
}

int64_t Fibonacci2(int64_t n)
{
    if (n < 2)
        return n;

    int64_t n1 = 0;
    int64_t n2 = 1;
    int64_t index = 2;
    int64_t nValue = 0;
    while (index <= n) {
        nValue = n1 + n2;   
        n1 = n2;
        n2 = nValue;
        ++index;
    }
    return nValue;
}

int main(int argc, char *argv[])
{
    int input = atoi(argv[1]);
    int64_t Result = Fibonacci2(input);
    cout << "enter the Fibonacci number:" << input << " The result is:" << Result << endl;
    return 0;
}


输出

E:\Project\Sample\test-c11\Debug>test-c11.exe 111
enter the Fibonacci number:111 The result is:7515661444929089378
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐