簡體   English   中英

理解遞歸canSum function

[英]Understanding recursive canSum function

我有一個 function,給定一個數字和一個數字列表,如果該數字可以由列表中的數字組成,則該數字可以根據需要多次使用:

def canSum(target_sum, numbers, memo = {}):
    if target_sum in memo:
        return memo[target_sum]
    if target_sum == 0:
        return True
    if target_sum < 0:
        return False

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

    memo[target_sum] = False
    return False,memo

它應該返回TrueFalse取決於是否可以通過在numbers列表中添加任何數字任意時間來生成target_sum

例如canSum(4, [2])應該返回True因為2+2是 4 等等。 但是我不明白我的錯誤在哪里,以下所有內容都應該返回True

canSum(4,[2])
# (False, {2: True, 4: False})

canSum(4,[2,1])
# (False, {2: True, 1: True, 3: True, 4: False})

canSum(4,[1,2])
# (True, {1: True, 2: True, 3: True, 4: True})

canSum(10,[2])
# (False, {2: True, 4: False, 6: False, 8: False, 10: False})

canSum(10,[2,3])
# (False, {2: True, 1: False, 4: False, 3: True, 6: False, 5: True, 8: False, 7: True, 10: False})

此外,是否有區別或需要將memo傳遞給遞歸 function 調用? 這似乎沒有任何區別。

 if canSum(remainder, numbers) == True: # -> if canSum(remainder, numbers, memo) == True:
    memo[target_sum] = True
    return True, memo

考慮當您調用canSum(0, [2])時, function 將返回文字True if canSum(0, [2]) == True條件將被滿足。 但是當您調用canSum(2, [2])時, function 將返回一個元組(True, {2: True})並且if canSum(2, [2]) == True條件將不被滿足。 因此,當您調用canSum(4, [2])時, function 將返回(False, {2: True, 4: False})

每次通話都必須以相同的格式返回。 我認為這將是工作。

def canSum(target_sum, numbers, memo={}):
    if target_sum in memo:
        return memo[target_sum], memo
    if target_sum == 0:
        return True, memo
    if target_sum < 0:
        return False, memo

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

    memo[target_sum] = False
    return False, memo

暫無
暫無

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

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