# 计算Fibonacci数: # Naive版本,时间效率O(1.618^n) # 记忆化版本(增加line8、10、13),时间效率O(n) # 注意:当n超过1000,可能超过系统允许的最大递归深度 from time import process_time # memo = {} def fib(n): # if n in memo: return memo[n] if n < 2: f = n else: f = fib(n-2) + fib(n-1) # memo[n] = f return f n = int(input(‘n = ‘)) start = process_time() print(fib(n)) elapsed = (process_time() - start) print("用时(秒):",elapsed)
# 计算Fibonacci数: # 迭代版本,时间效率O(n),空间效率O(n) # 注意:当n超过1000000,可能出现Memory Error from time import process_time memo = {} def fib(n): for i in range(n+1): if i < 2: f = i else: f = memo[i-1]+memo[i-2] memo[i] = f return memo[n] n = int(input(‘n = ‘)) start = process_time() print(fib(n)) elapsed = (process_time() - start) print("用时(秒):",elapsed)
# 计算Fibonacci数: # 空间效率优化为O(2),时间效率O(n) from time import process_time def fib(n): a, b = 0, 1 for i in range(n): a, b = b, a + b return a n = int(input(‘n = ‘)) start = process_time() print(fib(n)) elapsed = (process_time() - start) print("用时(秒):",elapsed)
# 计算Fibonacci数: # 利用矩阵幂次求解,由于使用分治方法,时间效率O(log(n)) from time import process_time def fib(n): F = [[1, 1], [1, 0]] if (n == 0): return 0 power(F, n - 1) return F[0][0] def multiply(F, M): x = (F[0][0] * M[0][0] + F[0][1] * M[1][0]) y = (F[0][0] * M[0][1] + F[0][1] * M[1][1]) z = (F[1][0] * M[0][0] + F[1][1] * M[1][0]) w = (F[1][0] * M[0][1] + F[1][1] * M[1][1]) F[0][0] = x F[0][1] = y F[1][0] = z F[1][1] = w def power(F, n): if( n == 0 or n == 1): return; M = [[1, 1], [1, 0]]; power(F, n // 2) multiply(F, F) if (n % 2 != 0): multiply(F, M) n = int(input(‘n = ‘)) start = process_time() print(fib(n)) elapsed = (process_time() - start) print("用时(秒):",elapsed)
原文:https://www.cnblogs.com/dgwblog/p/12021928.html