(经典)Python3 实现斐波那契数列的几种方法

PS:以下代码是以Python3来实现的

一、递归

时间复杂度:O(2n)
空间复杂度:O(1)

(不能使用这种代码,但是递归确实又是基本,因为递归是最简单的,所以还是知道有这么回事就行)

def fib_recursion(n: int) -> int:
    if n <= 0:
        return 0
    if n == 1 or n == 2:
        return 1
    else:
        return fib_recursion(n-2) + fib_recursion(n-1)

二、迭代(或动态规划)

时间复杂度:O(n)
空间复杂度:O(1)

def fib_iteration(n: int) -> int:
    if n <= 0:
        return 0

    a, b = 0, 1
    for _ in range(n):
        a, b = b, a+b
    return a


三、斐波那契矩阵

时间复杂度:O(log2n)
空间复杂度:O(1)

根据以下斐波那契矩阵公式,即可求出相应第n项的值:


同时:


所以:利用二分法实现快速幂,就可以达到O(log2n),只不过这里还需要自己去实现2×2矩阵的乘法运算,其他都类似

(PS:如果使用numpy的矩阵,可能计算会快一点(我没去尝试,有兴趣的大佬可以去试试),

但是毕竟numpy不是Python的内置包,所以笔试或面试像下面这样写都可以了,主要是掌握核心的快速幂的二分思想)

from typing import List

# 定义2×2矩阵的乘法运算
def matrix_mul(a: List[List[int]], b: List[List[int]]) -> int:
    c = [[0, 0], [0, 0]]
    c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0]
    c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1]
    c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0]
    c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1]
    return c


def fib_matrix(n: int) -> int:
    if n <= 1:
        return max(n, 0)
    res = [[1, 0], [0, 1]]  # 单位矩阵
    base = [[1, 1], [1, 0]]  # 斐波那契的基础矩阵
    # 快速幂
    while n:
        if n & 1:
            res = matrix_mul(res, base)
        base = matrix_mul(base, base)
        n >>= 1
    return res[0][1]


四、斐波那契通项公式

时间复杂度:O(1)
空间复杂度:O(1)

知道公式,就是转换成代码,没什么技术含量

斐波那契数列的通项公式为:

注意:在Python3里,当n较大时(大概1500左右),下面这个就会抛出Overflow异常

from math import sqrt


def fib_formula(n: int) -> int:
    return int(1/sqrt(5) * (pow((1+sqrt(5))/2, n) - pow((1-sqrt(5))/2, n)))




#Python##笔试题目#
全部评论
点赞 回复
分享
发布于 2019-09-07 10:51
这个哪叫二分法实现快速幂?? 不就判哪一位是1吗?
点赞 回复
分享
发布于 2019-09-07 10:59
联易融
校招火热招聘中
官网直投

相关推荐

1 10 评论
分享
牛客网
牛客企业服务