from functools import reduce
from functools import wraps
def memo(func):
cache = {}
@wraps(func)
def wrap(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrap
@memo
def fib(i):
if i <= 2:
return 1
return fib(i - 1) + fib(i - 2)
print(fib(10))
# encoding=utf-8
"""
标准库的做法
"""
class Solution(object):
# 矩阵相乘
def mul(self, a, b):
r = [[0, 0], [0, 0]]
r[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0]
r[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1]
r[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0]
r[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1]
return r
# 递归加速计算斐波那契数列 O(n^2) -> O(logn)
def helper(self, n):
if n == 0:
return [[1, 0], [0, 1]]
if n == 1:
return [[1, 1], [1, 0]]
if n & 1 == 0:
return self.mul(self.helper(n // 2), self.helper(n // 2))
else:
return reduce(self.mul, [self.helper((n - 1) // 2), self.helper((n - 1) // 2), [[1, 1], [1, 0]]])
def fib(self, N):
if N == 0 or N == 1:
return N
return self.helper(N - 1)[0][0]
if __name__ == "__main__":
for i in range(2, 11):
print(i, Solution().fib(i))
斐波那契数列及其变种 装饰器版本和矩阵加速
最新推荐文章于 2021-01-23 19:39:04 发布