编写一个函数:可以获得斐波那契数列每项的值,每调用一次返回一个值,函数可根据需要重复使用。
第一个解决方案:
#include <iostream>
#include <string>
using namespace std;
int fib()
{
static int a0=0; // 记录状态
static int a0=1;
int ret=a1;
a1=a0+a1;
a0=ret;
return ret;
}
int main()
{
for(int i=0;i<10;i++)
{
cout<<fib()<<endl; // 结论:fib()是带状态函数,每次调用返回结果都不同, 方法1:将函数内部使用的 // 变量用全局变量代替。方法2、使用静态局部变量。
}
for(int i=0;i<5;i++)
{
cout<<fib()<<endl;
}
}
函数一旦开始调用就无法重来:静态局部变量处于函数内部,外界无法改变。函数为全局函数,是唯一的,无法多次独立使用。无法指定某个具体的数列项作为初始值。
如果要从头开始处理方法:将a0,a1设置为全局变量,并且重新设置初值。为了不要重新赋初值:
解决方案:函数对象
使用具体的类对象取代函数。该类的对象具备函数调用的行为。构造函数指定具体数列项的起始位置。多个对象相互独立的求解数列项。
函数调用操作符(()):只能通过类的成员函数重载。可以定义不同参数的多个重载函数。
#include <iostream>
#include <string>using namespace std;
class Fib
{
int a0;
int a1;
public:
Fib()
{
a0 = 0;
a1 = 1;
}
Fib(int n)
{
a0 = 0;
a1 = 1;
for(int i=2; i<=n; i++)
{
int t = a1;
a1 = a0 + a1;
a0 = t;
}
}
int operator () () //函数名:operator ()
{
int ret = a1;
a1 = a0 + a1;
a0 = ret;
return ret;
}
};
int main()
{
Fib fib;
for(int i=0; i<10; i++)
{
cout << fib() << endl;
}
cout << endl;
for(int i=0; i<5; i++)
{
cout << fib() << endl;
}
cout << endl;
Fib fib2(10); //从第几项开始返回
for(int i=0; i<5; i++)
{
cout << fib2() << endl;
}
return 0;
}
函数对象用于在工程中取代函数指针。
数组-->数组对象,函数指针-->函数对象
本文介绍了一种改进的斐波那契数列生成方法,通过使用类对象替代传统函数,实现了从任意项开始生成数列的功能,解决了原有函数无法重置状态的问题。
1693

被折叠的 条评论
为什么被折叠?



