斐波那契数列的多种解法 递归和动态规划
斐波那契数列的多种解法 递归&动态规划
斐波那契数列:
0、1、1、2、3、5、8、13、21、34
递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 3 10:58:27 2021
@author: dujidan
"""
from collections import defaultdict
# 递归解法
def fib(n):
if n < 1:
return 0
if n == 1 or n == 2:
return 1
return fib(n - 1) + fib(n - 2)
# 带备忘录的递归解法
def fib(n):
if n < 1:
return 0
meno_dict = {}
return helper(meno_dict, n)
def helper(meno_dict, n):
if n == 1 or n == 2:
return 1
if n in meno_dict.keys():
return meno_dict[n]
else:
meno_dict[n] = helper(meno_dict, n -1) + helper(meno_dict, n -2)
return meno_dict[n]
# 动态规划一般都脱离了递归, 由循环迭代完成计算
# 数组迭代解法 动态规划
def fib(n):
dp_dict = defaultdict(int)
dp_dict[1] = 1
dp_dict[2] = 1
for i in range(3, n+1):
dp_dict[i] = dp_dict[i - 1] + dp_dict[i - 2]
return dp_dict[n]
# 当前状态只和之前的两个状态有关, 其实并不需要那么个 DP table 来存储所有的状态, 只要想办法存储之前的两个状态
# 所以, 可以进一步优化, 把空间复杂度降为 O(1)
def fib(n):大连做人流多少钱 http://www.120wtrlyy.com/
if n == 1 or n == 2:
return 1
prev = 1; curr = 1
for i in range(3, n+1):
sum_num = prev + curr
prev = curr
curr = sum_num
return curr
print(fib(200))
- 点赞
- 收藏
- 关注作者
评论(0)