这是斐波纳契系列生成的更好方法

时间:2011-05-17 05:17:25

标签: c++ fibonacci

Fibonacci系列生成的两种通用方法是:

  1. traditional方法,即在函数内部运行for循环。
  2. 递归
  3. 我遇到了另一个解决方案

    #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;
    }
    

    此解决方案在初始运行中看起来运行良好,但与传统和递归方法相比,这是否具有任何明显的缺点?

    我确信静态变量会增加空间复杂性,但至少我们不是使用递归构建函数表堆栈,对吗?

6 个答案:

答案 0 :(得分:7)

缺点我可以立即看到:

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

我倾向于采用一种方法,将状态保持在一个对象中,你可以要求下一个值 - 一个迭代器,基本上。 (我从来不确定Fibonacci序列是否容易映射到C ++迭代器;但它适用于C#和Java IEnumerable<T>Iterable<T>。)

答案 1 :(得分:2)

当您需要存储状态时(例如,当您计算Fibonacci数,基于它执行某些操作,然后计算另一个)时,您找到的解决方案是不错的,但在代码中的两个位置使用此解决方案将可能会给出有趣的结果这是因为静态变量总是相同的,无论你从哪里调用它。我会建议:

class FiboNumbers {
  public:
    FiboNumbers() :
        x_(1), y_() {}

    int getNext() {
        x_ += y_;
        y_ = x_ - y_;
        return x_;
    }

  private:
    int x_, y_;
};

这提供了相同的状态保持,但允许您创建类的多个实例,因此允许您使用代码的不同部分来计算他们自己的Fibonacci系列。

次要注意:我发布的代码将生成与您发布的示例相同的系列,但它将生成真实的Fibonacci序列,从0 1 1 2开始......

答案 2 :(得分:1)

我是一名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;
}

答案 3 :(得分:0)

我不确定这个功能到底应该做什么。它 只能在您呈现的确切循环中工作,并且与其他人一样 指出,它只能工作一次。 (而且可能有一个错字 在你的循环中,因为你的完整程序输出"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;
}

?它更复杂,更不健壮,也没那么有用。

答案 4 :(得分:0)

如前所述,静态变量的优点原则上是计算 n 的序列的 n -th元素更便宜 - 已经评估过1次。

除了静态变量固有的问题之外,最大的缺点是你没有任何方法可以回到序列中的早期点,也没有真正控制序列中的位置是在给定的时间。

按照Sevis的建议使用class肯定是实现这种类似静态的方法的更好方法:这样可以使一切更安全,让您轻松回到序列开始(简单来说)重新初始化对象)并且还可以实现更多功能,例如返回 k 步骤,查找当前位置等。

答案 5 :(得分:-3)

我认为这种指针方法对你更有用。

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));
}