簡體   English   中英

python字典.get()與字典中的元素在基於DP的遞歸程序中給出不同的結果

[英]python dictionary .get() vs element in dictionary giving different results in DP based recursion program

字典獲取 vs 在 cansum 代碼中表現不同

def canSum(targetSum, numbers, memo=None):
    if memo == None:
        memo = {}

    if targetSum in memo:
        return memo[targetSum]
    if targetSum == 0:
        return True
    if targetSum < 0:
        return False

    for n in numbers:
        remainder = targetSum - n
        if canSum(remainder, numbers, memo):
            memo[targetSum] = True
            return True

    memo[targetSum] = False
    return False


print(canSum(7, [2, 3])) # True
print(canSum(7, [5, 3, 4, 7])) # True
print(canSum(7, [2, 4])) # False
print(canSum(8, [2, 3, 5])) # True
print(canSum(3000, [7, 14])) # False -> Works fast with large inputs!

當用 if memo.get(targetSum) 替換第 4 行時,該函數對最后一個輸入不起作用,由於時間復雜度巨大而繼續運行

def canSum(targetSum, numbers, memo=None):
    if memo == None:
        memo = {}

    if memo.get(targetSum,False):
        return memo[targetSum]
    if targetSum == 0:
        return True
    if targetSum < 0:
        return False

    for n in numbers:
        remainder = targetSum - n
        if canSum(remainder, numbers, memo):
            memo[targetSum] = True
            return True

    memo[targetSum] = False
    return False


print(canSum(7, [2, 3])) # True
print(canSum(7, [5, 3, 4, 7])) # True
print(canSum(7, [2, 4])) # False
print(canSum(8, [2, 3, 5])) # True
print(canSum(3000, [7, 14])) # False -> Keeps running no output obtained

任何人都可以解釋原因嗎? 我知道 .get 和 in 的工作方式如何不同,在下面附上了相關的 SO 線程:

為什么此解決方案適用於 Javascript 而不適用於 Python? (動態編程)

Python 詞典:“in”與“get”

您的代碼的兩個版本並不等效。

memo[targetSum]存在且為False的情況下,塊:

if targetSum in memo:
    return memo[targetSum]

會返回False ,但是

if memo.get(targetSum,False):
    return memo[targetSum]

不會執行return ,因為memo.get(targetSum,False)False 在這種情況下,您將在函數末尾運行循環。

暫無
暫無

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

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