在使用元组作为缓存键的 Python 函数中手动记忆

Memoization By Hand in Python Function Using Tuples as Cache Keys

我正在尝试在以下函数中实现手动记忆,考虑到据说等待会增加乐趣,它会计算吃巧克力的最佳愉悦度:

def joy(chocs, day):
    n = len(chocs)
    if n == 1:
        return day * chocs[0]
    left = day * chocs[0] + joy(chocs[1:], day + 1)
    right = day * chocs[n - 1] + joy(chocs[:n - 1], day + 1)
    return max(left, right)

我想使用 cache 字典来存储以前的结果,但我在实现上卡住了。到目前为止,这是我的尝试:

def joy(chocs, day, cache={}):
    if (chocs, day) in cache:
        return cache[(chocs, day)]
    n = len(chocs)
    if n == 1:
        return day * chocs[0]
    left = day * chocs[0] + joy(chocs[1:], day + 1)
    right = day * chocs[n - 1] + joy(chocs[:n - 1], day + 1)
    return max(left, right)

我不知道用什么作为 key/value 来存储 left/right 结果。

谁能帮我完成功能的备忘版?

在 return 之前将结果存储在缓存中。

result = max(left, right)
cache[(chocs, day)] = result
return result

无需存储基本案例的结果。

只是颠倒你的逻辑

def joy(chocs, day, cache={}):
    if (chocs, day) not in cache:
        n = len(chocs)
        if n == 1:
            cache[(chocs,day)] = day * chocs[0]
        else:
            left = day * chocs[0] + joy(chocs[1:], day + 1)
            right = day * chocs[n - 1] + joy(chocs[:n - 1], day + 1)
            cache[(chocs,day)] = max(left, right)
    return cache[(chocs, day)]

这样可以确保您的缓存