这是斐波那契级数生成的更好方法

which is a better approach for fibonacci series generation

本文关键字:更好 方法      更新时间:2023-10-16

斐波那契级数生成的两种通用方法是:

  1. 传统方法,即在函数内运行 for 循环。
  2. 递归

我遇到了另一种解决方案

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

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

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

缺点我可以

立即看到:

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

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

当你需要存储状态时(例如,当你计算斐波那契数时,基于它做一些事情,然后计算另一个),你找到的解决方案是不错的,但是从代码中的两个地方使用它可能会得到有趣的结果。 这是因为静态变量将始终相同,无论您从何处调用它。 相反,我建议:

class FiboNumbers {
  public:
    FiboNumbers() :
        x_(1), y_() {}
    int getNext() {
        x_ += y_;
        y_ = x_ - y_;
        return x_;
    }
  private:
    int x_, y_;
};

这提供了相同的状态保持,但允许您创建类的多个实例,因此允许您拥有计算自己的斐波那契级数的代码的不同部分。

小注意:我发布的代码将产生与您发布的示例相同的系列,但它将产生真正的斐波那契数列,该序列以 0 1 1 2...

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

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

?它更复杂,远没有那么强大,也更不有用。

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

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

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

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

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("%dn", 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));
}