如何记忆功能

时间:2019-03-24 04:24:15

标签: python memoization

问题在于有一个数字金字塔,您正试图通过在金字塔中“潜行”来找到最大的总数。

我做了一个基本的“记忆化”技术,方法是制作一个数组并将其传递给每个函数调用。显然,这不是理想的,因为数组的大小是固定的,我不能让数组依赖于初始金字塔的大小,因为可选参数必须与此无关。我不确定如何使数组的大小取决于金字塔的大小,而无需对其进行硬编码或在调用函数时明确要求初始数组和初始大小。

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]

1 个答案:

答案 0 :(得分:0)

就像@KlausD。指出,Python仅具有称为list的动态数组。您可以分别使用.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)]