簡體   English   中英

如何記憶功能

[英]How to Memoize Function

問題是,有一個金字塔,你試圖通過“滑行”金字塔找到最大的金額。

我做了一個基本的“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]

作為@KlausD。 指出,Python只有名為list s的動態數組。 您可以分別使用.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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM