定义:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0, F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
递归法
递归主要是在函数内部调用自己.递归实现的代码,非常容易理解,代码也非常简洁,缺点是效率较低
def fab(n):
if n==0 or n==1:
return n
else:
return fab(n-1) + fab(n-2)
print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)
序列连接法
def myfibs(n):
seq = [0, 1]
while len(seq) < n:
seq += [seq[len(seq)-1] + seq[len(seq)-2]]
return seq
print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)
递推法
迭代主要思想为: 循环代码中参与运算的变量同时是保存结果的变量,最常见的迭代为遍历列表
def fab(n):
a, b = 0, 1
while n > 0:
a, b = b, a + b
n -= 1
return a
print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)
生成器法
def fab_demo4(num):
a,b = 0, 1
while max > 0:
yield a
a, b = b, a+b
num -= 1
for i in (fab_demo4(5)):#fab(1), fab(2), fab(3), fab(4), fab(5)
print i
类迭代方法
class Fibonacci(object):
def __init__(self, num):
self.num = num
def __iter__(self):
if self.num < 1:
yield 1
a, b = 0, 1
while self.num > 0:
yield a
a, b = b, a + b
self.num -= 1
def __next__(self):
return self.__iter__()
f = Fibonacci(5)
for i in f:
print(i)
修饰器法
def cache(func):
cached = {}
def _func(args):
if args not in cached:
cached[args] = func(args)
return cached[args]
return _func
@cache
def fab(n):
if n==0 or n==1:
return n
else:
return fab(n-1) + fab(n-2)
print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)
import time
start_time = time.time()
print fab(100)
end_time = time.time()
print end_time-start_time
矩阵法
《线性代数》是大学计算机专业类低年级的课程,这门课教的就是矩阵,其实矩阵的本质就是线性方程式。
斐波那契数列中两个相邻的项分别为:F(n) 和 F(n - 1),如果把这两个数当作一个2行1列的矩阵可表示为:
因为 F(n) = F(n-1)+F(n-2),所以就有:
通过反推,其实它是两个矩阵的乘积得来的
依此类推:
最后可推出:
代码实现如下:
import numpy
def fab(n):
return (numpy.matrix([[1, 1], [1, 0]]) ** (n - 1) * numpy.matrix([[1], [0]]))[0, 0]
print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)