【问题标题】:How to Memoize Function如何记忆功能
【发布时间】:2019-03-24 04:24:14
【问题描述】:

问题是存在一个数字金字塔,而您正试图通过“滑行”金字塔来找到最大的总和。

我做了一个基本的“记忆”技术,方法是创建一个数组并在每个函数调用中传递它。显然,这并不理想,因为数组是固定大小的,我不能让数组依赖于初始金字塔大小,因为可选参数必须独立于它。我不确定如何使数组大小取决于金字塔的大小,而无需对其进行硬编码或在调用函数时显式询问初始数组和初始大小。

def LSD2(pyramid, m = 0, n = 0, L = []):
    if len(L) == 0:
      L = [[None]*1000 for i in range(1000)]
    if len(pyramid) == 0:
      return 0

    else:
      if L[n][m] != None:
        return L[n][m]
      elif L[n-1][m] != None and L[n-1][m-1] != None:
        return max(pyramid[n][m] + max(L[n-1][m], L[n-1][m-1]))
      L[n][m] = pyramid[0][m] + max(LSD2(pyramid[1:], m, n + 1, L), LSD2(pyramid[1:], m+1, n + 1, L))
    return L[n][m]

【问题讨论】:

  • Python 没有数组,它有列表并且它们不是固定大小的。
  • 如果mn分别是行和列,则可以通过n数组初始化m,如l = [[None] * n for _ in range(m)]

标签: python memoization


【解决方案1】:

作为@KlausD。指出,Python 只有动态数组称为lists。您可以分别使用.append.remove 添加和删除元素。也就是说,考虑到您的用例,带有元组键的dict 可能是更好的选择。所以你的代码会变成:

def LSD2(pyramid, m = 0, n = 0, L = {}):
    if len(pyramid) == 0:
      return 0

    if (n, m) in L:
      return L[(n, m)]
    elif L.get((n-1, m), None) and L.get((n-1, m-1), None):
      return max(pyramid[n][m] + max(L[(n-1, m)], L[(n-1, m-1)]

    L[(n, m)] = pyramid[0][m] + max(LSD2(pyramid[1:], m, n + 1, L), LSD2(pyramid[1:], m+1, n + 1, L))  
    return L[(n, m)]

【讨论】:

  • 请注意,仅仅因为列表是动态的并不意味着您不能用预定的大小初始化一个。
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
相关资源
最近更新 更多