Fibonacci
来源:互联网 发布:国考经验知乎 编辑:程序博客网 时间:2024/05/29 17:44
斐波那契数列(Fibonacci)递归与非递归的性能对比
费波那契数列由0和1开始,之后的数就由之前的两数相加 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,……….
递归算法
用递归算法来求值,非常好理解.伪代码:
f(n) = 0 (n=0)f(n) = 1 (n=1)f(n) = f(n-1) + f(n-2) (n>1)
实现:
def f(n): if n==0: return 0 elif n==1: return 1 elif n>1: return f(n-1) + f(n-2)
非递归算法
def f(n): if n == 0: return 0 if n == 1: return 1 if n>1: prev = 1 #第n-1项的值 p_prev = 0 #第n-2项的值 result = 1 #第n项的值 for i in range(1,n): result = prev+p_prev p_prev = prev prev = result return result
功能实现了,但是代码比较冗长,函数是要对前两项做特殊判断.现在优化一下,如何才能更通用,即使是第0个和第1个也能运用到for循环呢?假设在 0, 1, 1, 2, 3, 5, 8, 13… 之前还有两项, 是-1和1, 即: -1, 1, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,这样就通用了:
def f(n): prev = 1 p_prev = -1 result = 0 for i in range(n+1): result = prev+p_prev p_prev = prev prev = result return result
现在评估一下他们的性能: 写一个性能装饰器.
def perfromce_profile(func): def wrapper(*args, **kwargs): start = time.time() rtn = func(*args, **kwargs) end = time.time() print end-start return rtn return wrapper
他不能用在递归方法中. 所以最终还是写了这么个方法:
import timedef f0(n): if n==0: return 0 elif n==1: return 1 elif n>1: return f(n-1) + f(n-2)def f(n): prev = 1 p_prev = -1 result = 0 for i in range(n+1): result = prev+p_prev p_prev = prev prev = result return result def perfromce_profile(): start = time.time() f0(1000000) end = time.time() print end-start start = time.time() f(1000000) print time.time()-startif __name__ == '__main__': perfromce_profile()
看出性能对比了吧:
54.290446996727.7642970085
所以用递归弊端还是不少
0 0
- Fibonacci
- fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- java注解的理解
- Struts1 和 Struts2区别
- What’s the difference between machine learning, statistics, and data mining?
- 进程与线程的一个简单解释
- 基于MT7688模块的开发笔记10——通过TFTP实现Ubuntu与开发板之间的文件传输
- Fibonacci
- SpringMVC 接收ajax发送的数组对象
- 关于缺少各种framework出现的错误累结
- hdu4764 2013长春网赛
- 欢迎使用CSDN-markdown编辑器
- python面向对象编程基础II(类的继承)
- iOS中Bitcode的介绍及配置
- 九度OJ - 1201 - 二叉排序树
- Web项目部署到tomcat