python斐波那契数列的计算方法


Posted in Python onSeptember 27, 2018

题目:

计算斐波那契数列。具体什么是斐波那契数列,那就是0,1,1,2,3,5,8,13,21,34,55,89,144,233。

要求:

时间复杂度尽可能少

分析:

给出了三种方法:

方法1:递归的方法,在这里空间复杂度非常大。如果递归层数非常多的话,在python里需要调整解释器默认的递归深度。默认的递归深度是1000。我调整了半天代码也没有调整对,因为递归到1000已经让我的电脑的内存有些撑不住了。

方法2:将递归换成迭代,这样时间复杂度也在代码中标注出来了。

方法3:这种方法利用了求幂的简便性,采用了位运算。但是代价在于需要建立矩阵,进行矩阵运算。所以,当所求的数列的个数较小时,该方法还没有第二种简便。但是当取的索引值n超级大时,这种方法就非常方便了。时间复杂度在代码中标注出来了。

代码:

#!usr/bin/python2.7
# -*- coding=utf8 -*-
# @Time  : 18-1-3 下午2:53
# @Author : Cecil Charlie

import sys
import copy
sys.setrecursionlimit(1000) # 用来调整解释器默认最大递归深度


class Fibonacci(object):
  def __init__(self):
    pass

  def fibonacci1(self, n):
    '''
      原始的方法,时间复杂度为 o(2**n),因此代价较大
    :param n: 数列的第n个索引
    :return: 索引n对应的值
    '''
    if n < 1:
      return 0
    if n == 1 or n == 2:
      return 1
    return self.fibonacci1(n-1) + self.fibonacci1(n-2)

  @staticmethod
  def fibonacci2(n):
    """
      用循环替代递归,空间复杂度急剧降低,时间复杂度为o(n)
    """
    if n < 1:
      return 0
    if n == 1 or n == 2:
      return 1
    res = 1
    tmp1 = 0
    tmp2 = 1
    for _ in xrange(1, n):
      res = tmp1 + tmp2
      tmp1 = tmp2
      tmp2 = res
    return res

  def fibonacci3(self, n):
    """
      进一步减少迭代次数,采用矩阵求幂的方法,时间复杂度为o(log n),当然了,这种方法需要额外计算矩阵,计算矩阵的时间开销没有算在内.其中还运用到了位运算。
    """
    base = [[1, 1], [1, 0]]
    if n < 1:
      return 0
    if n == 1 or n == 2:
      return 1
    res = self.__matrix_power(base, n-2)
    return res[0][0] + res[1][0]

  def __matrix_power(self, mat, n):
    """
      求一个方阵的幂
    """
    if len(mat) != len(mat[0]):
      raise ValueError("The length of m and n is different.")
    if n < 0 or str(type(n)) != "<type 'int'>":
      raise ValueError("The power is unsuitable.")
    product, tmp = [], []
    for _ in xrange(len(mat)):
      tmp.append(0)
    for _ in xrange(len(mat)):
      product.append(copy.deepcopy(tmp))
    for _ in xrange(len(mat)):
      product[_][_] = 1
    tmp = mat
    while n > 0:
      if (n & 1) != 0: # 按位与的操作,在幂数的二进制位为1时,乘到最终结果上,否则自乘
        product = self.__multiply_matrix(product, tmp)
      tmp = self.__multiply_matrix(tmp, tmp)
      n >>= 1
    return product

  @staticmethod
  def __multiply_matrix(mat1, mat2):
    """
      矩阵计算乘积
    :param m: 矩阵1,二维列表
    :param n: 矩阵2
    :return: 乘积
    """
    if len(mat1[0]) != len(mat2):
      raise ValueError("Can not compute the product of mat1 and mat2.")
    product, tmp = [], []
    for _ in xrange(len(mat2[0])):
      tmp.append(0)
    for _ in xrange(len(mat1)):
      product.append(copy.deepcopy(tmp))
    for i in xrange(0, len(mat1)):
      for j in xrange(0, len(mat2[0])):
        for k in xrange(0, len(mat1[0])):
          if mat1[i][k] != 0 and mat2[k][j] != 0:
            product[i][j] += mat1[i][k] * mat2[k][j]
    return product


f = Fibonacci()
print f.fibonacci1(23)
print f.fibonacci2(23)
mat1 = [[2,4,5],[1,0,2],[4,6,9]]
mat2 = [[2,9],[1,0],[5,7]]
print f.fibonacci3(23)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python抓取网页内容示例分享
Feb 24 Python
举例详解Python中的split()函数的使用方法
Apr 07 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
Django中url的反向查询的方法
Mar 14 Python
Python使用wget实现下载网络文件功能示例
May 31 Python
Django model反向关联名称的方法
Dec 15 Python
详解用python写一个抽奖程序
May 10 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
python实现读取excel文件中所有sheet操作示例
Aug 09 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
python实现汉诺塔算法
Mar 01 #Python
Python3中bytes类型转换为str类型
Sep 27 #Python
python求解数组中两个字符串的最小距离
Sep 27 #Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 #Python
详解django中使用定时任务的方法
Sep 27 #Python
Python高级特性切片(Slice)操作详解
Sep 27 #Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 #Python
You might like
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
js中如何把字符串转化为对象、数组示例代码
2013/07/17 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
详解React native fetch遇到的坑
2018/08/30 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
详解vue 组件
2020/06/11 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Python实现图片识别加翻译功能
2019/12/26 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
Python实现爬取并分析电商评论
2020/06/19 Python
pytorch中index_select()的用法详解
2021/01/06 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
美国在线宠物商店:Chewy
2019/01/12 全球购物
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
建筑设计师岗位职责
2013/11/18 职场文书
高中班级口号
2014/06/09 职场文书
爱牙日活动总结
2014/08/29 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
pycharm无法安装cv2模块问题
2022/05/20 Python