斐波那契数列的多种解法 递归&动态规划

斐波那契数列的多种解法 递归&动态规划

斐波那契数列:
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):
    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))

参考:labuladong 公众号

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值