在学习高中数学“数列及其性质”一章时,了解到斐波那契数列这一内容,这篇文章主要讲述如何使用Python输出斐波那契数列
I - 斐波那契数列简介
斐波那契数列,是指这样一组数列:
1,1,2,3,5,8,13,21…
像这样,从第三位开始,每一位数都等于前面两位数的和。在数学中,它的递推公式这样表示:
a n = a n − 1 + a n − 2 , n ∈ [ 3 , + ∞ ) a_{n} = a_{n-1} + a_{n-2} , n \isin [3,+∞) an=an−1+an−2,n∈[3,+∞)
II - 解决方案一 - 利用递推公式实现
根据这个递推公式,能够推测出其实现方式。首先明确第一项和第二项,之后依次加和,之后得出对应数字,代码示例如下:
#Fibonacci - 斐波那契数列
#解决方案一 - 利用递推公式实现
#此处为函数形式, 其中的n表示第n项
#数据以返回的形式得到
def fibonacci(n):
s = [1,1]
if n <= 2:
return 1
else:
for x in range(n-2):
s.append(s[x]+s[x+1])
return s[n-1]
测试代码:
while True:
n = int(input(" --> "))
print(fibonacci(n))
输出结果(如下图):
注意:输入的数据不要过大,否则会报错
III - 解决方案二 - 利用通项公式实现
本人注意到,高中阶段的数学中并没有系统地讲到斐波那契数列的通项公式。查阅资料后了解到斐波那契数列的通项公式:
a n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 a_n = \frac{(\frac{1+\sqrt{5}}{2}\quad)^n - (\frac{1 - \sqrt{5}}{2}\quad)^n}{\sqrt{5}} \quad an=5(21+5)n−(21−5)n
根据通项公式进行编写,代码示例如下:
def fibonacci(n):
a = (math.pow( ((1+math.sqrt(5)) / 2 ) , n ) - math.pow( ((1-math.sqrt(5)) / 2 ) , n) )/ math.sqrt(5)
return math.floor(a)
测试代码请看本文“解决方案一”部分~
两中解决方案比较的利弊:
解决方案一:
利: 由于只包括加减运算,计算量较小
弊: 由于涉及到递推运算,可能有点难懂……
解决方案二:
利: “套公式”,通俗易懂
弊: 由于涉及到幂运算,计算量大,从测试上就能体现
在测试程序中,解决方案一表现很好,当n取到10^5的时候,部分数值仍能计算;>
但是解决方案二则一落千丈,当n取到10^4时就报错了
IV - 应用
利用此函数,我们能轻松地得到斐波那契数列的第n项值,并且可以用此函数画出斐波那契数列的图像
注意:对于一个数列来说,他的图像并不是一个连续的曲线,而是分散的点,这里为了方便绘画和表示,作者将各点用红色线连接
横坐标在正整数集中取得,纵坐标为对应函数值
代码示例如下:
#应用 - 绘画图像
import turtle
t = turtle.Turtle()
#绘制平面直角坐标系,单位长度
t.speed(0)
t.up()
t.goto(0,0)
t.down()
t.goto(0,1000)
t.goto(0,-1000)
t.goto(0,0)
t.goto(1000,0)
t.goto(-1000,0)
t.goto(0,0)
#图像的纵坐标 y 的取值范围:0 <= y <= 1000,且 x ∈ N+
i = 1
t.color("red")
while fibonacci(i) <=1000:
t.goto(i,fibonacci(i))
i += 1
图像如图所示: