Fibonacci数列:
- 就是前两个数为1, 从第三个数字开始,该数字是前两个数字得和。
c语言实现
- 很简单,就是设置三个变量,依次循环,第三个变量等于前两个变量的和。
// c语言实现斐波那契数列:计算第n个斐波那契数的值
#include<stdio.h>
int main()
{
int n;
long int f1=1, f2=1, f3;
printf("请输入想要的斐波那契数(n>=3):\n");
scanf("%d", &n);
for(int i = 1; i <=n - 2 ; i++)
{
f3 = f1 + f2;
printf("%12d\n", f3);
f1 = f2;
f2 = f3;
}
return 0;
}
(补充)C语言利用数组实现,可选择输出第几个斐波那契数
#include<stdio.h>
int main()
{
// 默认创建30个长度
int m;
int f[30]={1,1};
while(true)
{
for(int i=2; i<30; i++)
f[i] = f[i-1] + f[i-2];
printf("请输出要获取的:\n");
scanf("%d", &m);
if (m <= 30 && m > 0)
printf("%d\n", f[m - 1]);
else
printf("请输入30以内的数字序号\n");
}
return 0;
}
python实现(迭代器)
# 官方文档介绍:点击进入
迭代器:
- 我所理解的迭代器,就是普通的类,实现了 __iter 和 __next 方法。也就是完成这一协议(类中定义有这两个方法,就称为迭代器)
class Fibonacci():
# 起始的两个数定义为类属性
f1 = 1
f2 = 1
def __init__(self, n):
self.n = n
self.i = 1
def __iter__(self):
return self
def __next__(self):
# 逻辑和 C实现的逻辑一样(注意 i 定义为实例属性,才可以保存数值,一直加1)
if self.i <= self.n:
f3 = self.f1 + self.f2
self.f1 = self.f2
self.f2 = f3
self.i += 1
return f3
else:
raise StopIteration
fi = Fibonacci(9)
fii = iter(fi)
# 两种启动方式
# (1)循环next()挨个打印,超出长度报错
for i in range(20):
print(next(fii))
# (2)
# 在幕后,for 语句会在容器对象上调用 iter()。
# 该函数返回一个定义了 __next__() 方法的迭代器对象,此方法将逐一访问容器中的元素。
# 当元素用尽时,__next__() 将引发 StopIteration 异常来通知终止 for 循环
for i in fii:
print(i)
结果:
2
3
5
8
13
21
34
55
89
Traceback (most recent call last):
File "c:/Users/huangdonglin/Desktop/python2019资料/试题分析/python高级/python算法题/斐波那契数列.py", line 30, in <module>
print(next(fii))
File "c:/Users/huangdonglin/Desktop/python2019资料/试题分析/python高级/python算法题/斐波那契数列.py", line 21, in __next__
raise StopIteration
StopIteration
(第一个 for next 会报错,i 循环次数,超过预定的n 值)
python实现(逆天简单的生成器)
生成器:
-
顾名思义:生成迭代器~~~~
-
官方介绍:
-
生成器 是一个用于创建迭代器的简单而强大的工具。 它们的写法类似于标准的函数,但当它们要返回数据时会使用 yield 语句。 每次在生成器上调用 next() 时,它会从上次离开的位置恢复执行(它会记住上次执行语句时的所有数据值)
-
生成器不必基于类实现, 单单类似于函数的方式即可!
def fibonacci(n):
f1 = f2 = 1
for i in range(n):
f3 = f1 + f2
f1, f2 = f2, f3
yield f3
# 输出结果与上面一致
#(1)
for i in fibonacci(10):
print(i)
# (2)
# 这种调用的差异是: 需要手动的去调用一下 iter方法,获取它的返回值(带有 next方法的实例)
ff = iter(fibonacci(10))
for i in range(12): # 超出10,会报错
print(next(ff))
-
官方介绍:
-
可以用生成器来完成的操作同样可以用前一节所描述的基于类的迭代器来完成。 但生成器的写法更为紧凑,因为它会自动创建 iter() 和 next() 方法。
-
另一个关键特性在于局部变量和执行状态会在每次调用之间自动保存。 这使得该函数相比使用 self.index 和 self.data 这种实例变量的方式更易编写且更为清晰。