Python斐波那契数列集锦(Fibonacci sequence)

斐波那契数列属于比较经典的程序语言练手算法了(算法具体内容请自行百度)。

有意思的是,通过实现斐波那契,可以体现出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的版本,而递归算法最不推荐(含有大量的重复计算)。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值