斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:一、一、二、三、五、八、1三、2一、3四、……在数学上,斐波纳契数列以以下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。python
其实就是从第三项开始,每项的值等于前两项的和。面试
下面是在面试中常见的问题:青蛙跳台阶函数
一只青蛙一次能够跳上1级台阶,也能够跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。spa
只有一级台阶时,1;code
有两节台阶的时候有两种跳法,11和2;递归
有三节台阶的时候有三种跳法,1十一、十二、21ci
有四阶台阶的时候,有五种跳法,11十一、1十二、12一、2二、211数学
fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)
经过执行fib(n)
来输出斐波那契数列前n项的值。it
也能够经过listData = [fib(i) for i in range(1,n)]
来生成斐波拉契数列前n项的值,最后经过print listData
能够打印出结果。class
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 1 return fib(i-1) + fib(i-2)
def fib(n): a, b = 0, 1 for _ in xrange(n): a, b = b, a + b return b
class Fib(object): def __init__(self): self.prev = 0 self.curr = 1 def __iter__(self): return self def __next__(self): value = self.curr self.curr += self.prev self.prev = value return value
python2须要修改__next__(self)
:方法,其实生成的是一个无限循环的迭代器,也能够使用 itertools模块把无限迭代器转为有限迭代器。
from itertools import islice class Fib: def __init__(self): self.prev = 0 self.curr = 1 def __iter__(self): return self def __next__(self): value = self.curr self.curr += self.prev self.prev = value return value >>> f = Fib() >>> list(islice(f, 0, 10)) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]