python解决斐波拉契问题的n种方法
1.最常用的是递归,但是在python中递归的深度有限
def fibonacci(n): if n==1 or n==2: return 1 else: return fibonacci(n-1) + fibonacci(n-2)
2.迭代方法,通过保存中间变量来求解斐波拉契
def fibonacci(n): a = 0 b = 1 while n>0: a, b = b, a+b n -= 1 return a
在python中保存中间变量可以有多种实现
用 yield 生成器实现斐波拉契:
def fibonacci(n): a = 0 b = 1 while n>0: a, b = b, a+b n -= 1 yield a
装饰器给fibonacci加缓存来实现斐波拉契:
from functools import wraps def memo(fn): cache = {} miss = object() @wraps(fn) def wrapper(*args): result = cache.get(args, miss) if result is miss: result = fn(*args) cache[args] = result return result return wrapper @memo def fib(n): if n < 2: return n return fib(n - 1) + fib(n - 2) print fib(10)
尾递归实现斐波拉契:
def fib(n): def fib_iter(n,x,y): if n==0 : return x else : return fib_iter(n-1,y,x+y) return fib_iter(n,0,1)
利用列表实现斐波拉契:
def fib(n): fibs = [0, 1] for number in range(n-1): fibs.append(fibs[-2] + fibs[-1]) print fibs[-1]
3.矩阵求解斐波拉契
def getNthNumber(n): n = n+1 def m1(a,b): m=[[],[]] m[0].append(a[0][0]*b[0][0]+a[0][1]*b[1][0])%1000000007) m[0].append((a[0][0]*b[0][1]+a[0][1]*b[1][1])%1000000007) m[1].append((a[1][0]*b[0][0]+a[1][1]*b[1][0])%1000000007) m[1].append((a[1][0]*b[1][0]+a[1][1]*b[1][1])%1000000007) return m def m2(a,b): m=[] m.append((a[0][0]*b[0][0]+a[0][1]*b[1][0])%1000000007) m.append((a[1][0]*b[0][0]+a[1][1]*b[1][0])%1000000007) return m return m2(reduce(m1,[[[0,1],[1,1]] for i in range(n)]),[[0],[1]])[0]
4.公式求解斐波拉契
斐波拉契的通项公式为:
def fibonacci(n): z = pow(5.0, 0.5) x = pow((1+z)/2, n) y = pow((1-z)/2, n) return ((x-y)/z)