本文主要是介绍python中生成斐波拉契数列的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 斐波拉契数列简介
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
其实就是从第三项开始,每项的值等于前两项的和。我们来看下面一道常见的面试题:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
只有一级台阶时,1;
有两节台阶的时候有两种跳法,11和2;
有三节台阶的时候有三种跳法,111、12、21
有四阶台阶的时候,有五种跳法,1111、112、121、22、211
......
2.实现斐波拉契数列生成
2.1 用匿名函数的方式生成
fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)
通过执行>>>fib(n) 来输出斐波拉契数列第n项的值。
也可以通过 listData = [fib(i) for i in range(1,n)]来生成斐波拉契数列前n项的值,最后通过print listData可以打印出结果。
2.2 利用装饰器的方式生成
def memo(func):cache = {}def wrap(*args):if args not in cache:cache[args] = func(*args)return cache[args]return wrap@ memo
def fib(i):if i < 2:return 1return fib(i-1) + fib(i-2)
对于装饰器,这里暂时不做过多的解析,请大家暂时自行查阅学习。
效果图:
2.3 定义简单的方法来实现
def fib(n):a, b = 0, 1for _ in xrange(n):a, b = b, a + breturn b
执行效果图:
2.4 利用迭代器的方式实现
class Fib:def __init__(self):self.prev = 0self.curr = 1def __iter__(self):return selfdef __next__(self):value = self.currself.curr += self.prevself.prev = valuereturn value
这里我用的是python3,python2需要修改__next__(self):方法,其实生成的是一个无限循环的迭代器,也可以使用 itertools模块把无限迭代器转为有限迭代器。
from itertools import isliceclass Fib:def __init__(self):self.prev = 0self.curr = 1def __iter__(self):return selfdef __next__(self):value = self.currself.curr += self.prevself.prev = valuereturn value>>> f = Fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
但是这种方法不能单独取出第n项的值。不建议用这种方法实现斐波拉契数列,但是可以作为一种装逼的方式,在面试的时候可以给你增加点分数,其实就是迭代器的使用方式。
以上是我简单的总结的几种方式,以后有新的实现方式会修改博客进行更新,有其他方法的学友可以在下面留言分享交流,共同学习,谢谢。
这篇关于python中生成斐波拉契数列的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!