C++ 哪种方法生成斐波那契级数更好

C++ 哪种方法生成斐波那契级数更好,c++,fibonacci,C++,Fibonacci,斐波那契级数生成的两种一般方法是: 方法,即在函数内运行for循环 递归 我找到了另一个解决办法 #include <iostream> using namespace std; void fibo() { static int y = 0; static int x = 1; cout << y << endl; y = x + y; x = y - x; } int main() { for (int i = 1; i <= 1;

斐波那契级数生成的两种一般方法是:

  • 方法,即在函数内运行for循环
  • 递归
  • 我找到了另一个解决办法

    #include <iostream>
    
    using namespace std;
    
    void fibo() {
     static int y = 0;
     static int x = 1;
     cout << y << endl;
     y = x + y;
     x = y - x;
    }
    
    int main() {
     for (int i = 1; i <= 1; i++) {
      fibo();
     }
     return 0;
    }
    
    #包括
    使用名称空间std;
    void fibo(){
    静态int y=0;
    静态int x=1;
    
    我可以立即看到:

    • 通过本质上使状态全局化,它不是线程安全的
    • 您只能在序列中运行一次,因为无法重置

    <>我希望有一种方法,它可以将状态保持在一个对象中,它基本上可以要求迭代器的下一个值。(我从来没有确定Fibonacci序列如何容易地映射到C++迭代器,它用C和java的代码> iQueabd和<代码>迭代< <代码>很好。我认为这种指针方法对您更有用

    void main()
    {
        int i,p, *no,factorial,summ;
    
        int fib(int p);
    
        clrscr();
    
        printf("\n Enter The Number:");
        scanf("%d", no);
        printf("\n The Fibonnacci series: \n");
    
        for(i=0; i < *no; i++)
            printf("%d\n", fib(i));
    
        getch();
    }
    
    int fib(int p)
    {
        if(p == 0)
            return(0);
        if(p >= 1 && p <= 2)
            return(1);
        else
            return(fib(p - 1) + fib(p - 2));
    }
    
    void main()
    {
    整数i,p,*no,阶乘,求和;
    int-fib(int-p);
    clrsc();
    printf(“\n输入数字:”);
    scanf(“%d”,否);
    printf(“\n Fibonnacci系列:\n”);
    对于(i=0;i<*否;i++)
    printf(“%d\n”,fib(i));
    getch();
    }
    int fib(int p)
    {
    如果(p==0)
    返回(0);
    
    如果(p>=1&&p当您需要存储状态时,您找到的解决方案是合适的(例如,当您计算斐波那契数时,根据它做一些事情,然后计算另一个),但在代码中的两个位置使用它可能会产生有趣的结果。这是因为静态变量总是相同的,无论从何处调用它。我建议:

    class FiboNumbers {
      public:
        FiboNumbers() :
            x_(1), y_() {}
    
        int getNext() {
            x_ += y_;
            y_ = x_ - y_;
            return x_;
        }
    
      private:
        int x_, y_;
    };
    
    这提供了相同的状态保持,但允许创建类的多个实例,因此允许代码的不同部分计算它们自己的斐波那契级数

    #include<iostream>
    
    using namespace std;
    
    void fibseries(long int n)
    {
        double x=0;double y=1;
        for (long int i=1;i<=n;i++)
         {
            if(i%2==1)
             {
                cout<<x<<" ";
                x=x+y;
             } 
            else 
             {
                cout<<y<<" ";
                y=x+y;
             }
         }
    }
    
    main()
    {
        long int n=0;
        cout<<"The number of terms ";
        cin>>n;
        fibseries(n);
        return 0;
    }
    

    次要提示:我发布的代码将生成与您发布的示例相同的序列,但它将生成真正的斐波那契序列,该序列从0 1 1 2开始…

    我不确定此函数真正应该做什么。它 只有在您当前的确切循环中才起作用,就像其他人一样 他指出,它只工作一次。(而且可能是打字错误。) 在循环中,由于整个程序输出
    “0”
    ,并且 除此之外,它还有什么优势:

    int y = 0;
    int x = 1;
    for ( int i = 0; i < count; ++ i ) {
        std::cout << y <<std::endl;
        y = x + y;
        x = y - x;
    }
    
    inty=0;
    int x=1;
    对于(int i=0;i正如前面所说,静态变量的优点是,原则上,在已经计算了第n-1个元素的序列中,计算第n个元素更便宜

    除了静态变量固有的问题外,最大的缺点是,您没有任何方法返回序列中的较早点,也无法很好地控制在给定时间序列中的位置

    使用Sevis推荐的
    ,无疑是实现这种类似静态的方法的更好方法:这使一切更加安全,为您提供了一种返回序列开始的简单方法(只需重新初始化对象)还可以实现进一步的功能,比如返回k步,查找当前位置等。

    < P>我是C++学生(1.5个月)。

    给我反馈我对斐波那契数列的不同想法

    #include<iostream>
    
    using namespace std;
    
    void fibseries(long int n)
    {
        double x=0;double y=1;
        for (long int i=1;i<=n;i++)
         {
            if(i%2==1)
             {
                cout<<x<<" ";
                x=x+y;
             } 
            else 
             {
                cout<<y<<" ";
                y=x+y;
             }
         }
    }
    
    main()
    {
        long int n=0;
        cout<<"The number of terms ";
        cin>>n;
        fibseries(n);
        return 0;
    }
    
    #包括
    使用名称空间std;
    空值系列(长整数n)
    {
    双x=0;双y=1;
    
    对于(long int i=1;i如果要重新启动序列,会发生什么情况?只有在缓存结果或只需要序列一次时,这才真正有用。让你作为第一个回答我问题的人满足了我一年的胃口!!:D非常严肃地说……我同意,这绝对不是线程安全的,而且序列不可能被重新启动e-run…-ivara关于优点/缺点的答案在哪里?如果有的话,还可以查看一些关于如何使用scanf的示例。Markus,这可能是我对这个问题的误解,对此表示抱歉..thanx用于提醒我“scanf”语法(“,@”)…这是一个错误的答案,因为主函数具有非标准返回类型,使用非标准函数,并导致未定义的行为,因为
    no
    在未初始化的情况下使用。最重要的是:
    fib
    函数的实现具有指数运行时间(和线性堆栈空间使用)只有当你对问题有一个确定的答案时,它才比OP.post链接的“传统方法”更可取。从你的帖子上看,你似乎在提出另一个问题,而不是在这里回答。答案部分不是用来提出问题的