python解决斐波拉契问题的n种方法
2015-08-05 11:32
721 查看
1.最常用的是递归,但是在python中递归的深度有限
2.迭代方法,通过保存中间变量来求解斐波拉契
在python中保存中间变量可以有多种实现
用 yield 生成器实现斐波拉契:
装饰器给fibonacci加缓存来实现斐波拉契:
尾递归实现斐波拉契:
利用列表实现斐波拉契:
3.矩阵求解斐波拉契
4.公式求解斐波拉契
斐波拉契的通项公式为:
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)
相关文章推荐
- 【python工具篇】pip和pypi
- python安装各种插件
- python中str()与repr()的区别
- 《父与子的编程之旅-与小卡特一起学python》第18章
- 从零开始学Python
- python中range和xrnage的区别
- 从零开始学Python
- 从零开始学Python
- 从零开始学Python
- python多线程编程(3): 使用互斥锁同步线程
- 从零开始学Python
- python socket的代码实例
- 怎样将utf-8格式的文件转换成gbk格式的文件
- Ubuntu系统下,Python的使用和idle的安装使用
- python 学习笔记 函数和类
- python小技巧之——in判断
- PYTHON开发入门与实战14-基于EXTJS的界面
- Python 使用requests时的编码问题
- python--参数列表的分拆
- Python开发入门与实战14-基于Extjs的界面