美文网首页
斐波那契问题

斐波那契问题

作者: 小吉头 | 来源:发表于2020-11-07 07:44 被阅读0次

计算运行时间

import time

def cal_time(func):
    def wrapper(*args,**kwargs):
        t1 = time.time()
        result = func(*args,**kwargs)
        t2 = time.time()
        print("%s running time: %s secs." % (func.__name__,t2 - t1))
        return result
    return wrapper

斐波那契三种写法

斐波那契数列 1 1 2 3 5 8 ... F(n) = F(n-1)+F(n-2) F(0)=1 F(1)=1,时间复杂度O(2 ^ n)

  • 方法1,使用递归,时间复杂度有点复杂先不研究..
def fibnacci(n):
    if n == 0 or n == 1:
        return 1
    else:
        return fibnacci(n-1) + fibnacci(n-2)

#由于使用了递归,需求套个函数才能计算运行时间,否则运行时间也会不断递归
@cal_time
def fib1(n):
    return fibnacci(n)

print(fib1(10))
  • 方法2,使用列表存储每次的结果,增加了空间复杂度
#时间复杂度O(n),空间复杂度O(n)
@cal_time
def fib2(n):
    li = [1,1] #设置0、1下标的初始值
    for i in range(2,n+1):
        li.append(li[-1] + li[-2])
    return li[n]

print(fib2(10))
  • 方法3最优,使用变量只存储最近的两次结果,空间复杂度只有O(1)
#时间复杂度O(n),只有几个变量,所以空间复杂度O(1)
@cal_time
def fib3(n):
    a = 1
    b = 1
    c = 1
    for i in range(2,n+1):
        c = a + b
        a = b
        b = c
    return c

print(fib3(10))

相关文章

网友评论

      本文标题:斐波那契问题

      本文链接:https://www.haomeiwen.com/subject/eqkfbktx.html