这是斐波那契级数生成的更好方法
which is a better approach for fibonacci series generation
斐波那契级数生成的两种通用方法是:
- 传统方法,即在函数内运行 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;
}
此解决方案在初始运行中看起来运行良好,但与传统和递归方法相比,这有什么明显的缺点吗?
我确信静态变量会增加空间的复杂性,但至少我们没有使用递归构建函数表堆栈,对吗?
立即看到:
- 通过本质上使状态全局化,它不是线程安全的
- 您只能运行一次序列,因为无法重置
我倾向于一种方法,将状态保存在一个对象中,你可以要求下一个值 - 基本上是一个迭代器。(我从来不确定斐波那契数列映射到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));
}
- 初始化具有非默认构造函数的std::数组项的更好方法
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 编写按初始值循环的循环的更好方法是什么
- 用 c++ 为游戏制作"bullet"的更好方法?
- 在CMakeLists中包含目录的更好方法.txt
- 将QDomDocument数据用作文本的更好方法
- C++ - 创建具有相同字符的特定大小的以 null 结尾的 c 样式字符串的更好方法
- 在 sqlite3 中批量插入的更好方法C++
- 设计许多单例代码结构的更好方法
- 使用继承的类模板避免公共成员不可见和源代码膨胀/重复的更好方法
- 在初始化列表中初始化数组的更好方法
- 将对象从一个 std::d eque 移动到另一个的更好方法
- 请告诉我在巴泽尔拥有多平台工作空间的更好方法
- 构造具有大量数据的对象的更好方法(C++)
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 在C++中创建不可变对象的更好方法
- 在构造函数中组织初始值设定项列表的更好方法
- std::copy with return values - 防止"expression: string iterators incompatible"的更好方法?
- 删除数组成员的更好方法是什么?
- 在C 中操作数据的更好方法是什么