斐波那契数列属于比较经典的程序语言练手算法了(算法具体内容请自行百度)。
有意思的是,通过实现斐波那契,可以体现出Python语言的很多特性,因此对几种常见的实现进行总结。
一、一般实现
1.1 官网版本:
# -*- coding: utf-8 -*-
def officalFabList(fab_n):
'''官网取得是值小于x的数列,
这里逻辑稍作修改:修改为前n个'''
ft, st = 0, 1
result = []
for _ in xrange(fab_n):
ft, st = st, ft+st
result.append(ft)
return result
1.2 严格按算法描述实现版:
# -*- coding: utf-8 -*-
def normalFabList(fab_n):
'''严格按照算法定义实现逻辑'''
fab_list = []
for index in xrange(fab_n):
if index < 2:
fab_list.append(1)
continue
fab_list.append(fab_list[index-1] + fab_list[index-2])
return fab_list
二、递归法实现:
2.1 普通递归函数
# -*- coding: utf-8 -*-
def recursionFabList(fab_n):
def __getFabN(_n):
'''通过递归调用算出第n个数的值'''
if _n < 2:
return 1
return __getFabN(_n-1) + __getFabN(_n-2)
'''返回含n个数字的斐波那契数列'''
return map(__getFabN, xrange(fab_n))
2.2 “简化”递归函数
# -*- coding: utf-8 -*-
def simplifyFabList(fab_n):
fab = lambda n: 1 if n < 2 else fab(n-1)+fab(n-2)
return map(fab, xrange(fab_n))
三、生成器实现:
3.1 一般生成器
# -*- coding: utf-8 -*-
def generatorFabList(fab_n):
def __fabGen():
ft, st = 1, 1
for _ in xrange(fab_n):
yield ft
ft, st = st, ft+st
return list(__fabGen())
3.2 类生成器
# -*- coding: utf-8 -*-
class Fab:
def __init__(self):
self.ft, self.st = 0, 1
def __iter__(self):
return self
def next(self):
self.ft, self.st = self.st, self.ft+self.st
return self.ft
def getFabClass(fab_n):
generate, result = Fab(), []
for index, num in enumerate(generate, start=1):
result.append(num)
if index == fab_n:
break
return result
总结:
还有很多含有细微变化的代码段就不贴了,基本上网上的所有版本都是围绕着以上三类思路出发的。无论从效率还是内存上而言,都建议使用3.1的版本,而递归算法最不推荐(含有大量的重复计算)。