【递归】(三) (Memorization) 记忆化技术

这篇博客探讨了递归中的重复计算问题,通过斐波那契数列的计算实例展示了记忆化技术的重要性。文章详细介绍了如何使用记忆化递归提高算法性能,包括有记忆递归的实现以及官方和自定义的解决方案。此外,还讨论了爬楼梯问题,利用数学方法和斐波那契数列的特性提出了解决策略,并分析了不同方法的时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

目录

一、递归中的重复计算

二、斐波那契数

2.1 题目要求

2.2 解决过程

三、爬楼梯

3.1 题目要求

3.2 解决过程

四、爬楼梯多解


一、递归中的重复计算

# Python implementation
def fibonacci(n):
    """
    :type n: int
    :rtype: int
    """
    if n < 2:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

def fib(self, N):
    """
    :type N: int
    :rtype: int
    """
    cache = {}
    def recur_fib(N):
        if N in cache:
            return cache[N]
        if N < 2:
            result = N
        else:
            result = recur_fib(N-1) + recur_fib(N-2)

        # put result in cache for later reference.
        cache[N] = result
        return result

    return recur_fib(N)

参考文献:https://leetcode-cn.com/explore/orignial/card/recursion-i/258/memorization/1211/


二、斐波那契数

2.1 题目要求

2.2 解决过程

个人实现

法一:无记忆递归

2020/07/19 - 18.27% (800ms) - 最简单但低效的方法 

class Solution:
    def fib(self, N: int) -> int:
        if N == 1:
            return 1
        if N == 0:
            return 0
        return self.fib(N-1) + self.fib(N-2)

法二:有记忆递归。使用字典 memory 来记忆计算过的结果,避免重复冗余的计算。

2020/07/19 - 53.74% (44ms) - 性能显著提升,但由于实现存在问题,未能发挥最佳效果 (对比官方法三)

class Solution:
    def __init__(self):
        self.memory = {0: 0, 1: 1}  # 计算记录, 但其实这种方式效率并不高, 详见官方法三

    def fib(self, N: int) -> int:
        if N in self.memory:
            return self.memory[N]
        else:
            self.memory[N] = self.fib(N-1) + self.fib(N-2)  # 记忆
        
        return self.memory[N]

官方实现与说明

class Solution:
    def fib(self, N: int) -> int:
        if N <= 1:
            return N
        return self.fib(N-1) + self.fib(N-2)

2020/07/19 - 12.98% (800ms)


class Solution:
    def fib(self, N: int) -> int:
        if N <= 1:
            return N
        return self.memoize(N)

    def memoize(self, N: int) -> {}:
        cache = {0: 0, 1: 1}
        # Since range is exclusive and we want to include N, we need to put N+1.
        for i in range(2, N+1):
            cache[i] = cache[i-1] + cache[i-2]
        return cache[N]

2020/07/19 - 73.37% (40ms)


## 这比个人实现二还要好, 注意对比 cache 的来源与差异
class Solution:
    def fib(self, N: int) -> int:
        if N <= 1:
            return N
        self.cache = {0: 0, 1: 1}  # 比放在数据成员的个人实现法二要好
        return self.memoize(N)

    def memoize(self, N: int) -> {}:
        if N in self.cache:
            return self.cache[N]
        self.cache[N] = self.memoize(N-1) + self.memoize(N-2)
        return self.memo
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值