【问题标题】:Understanding recursive canSum function了解递归 canSum 函数
【发布时间】:2021-01-05 20:57:31
【问题描述】:

我有一个函数,给定一个数字和一个数字列表,如果该数字可以由 列表中的数字,其中数字可以根据需要多次使用:

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,这取决于target_sum 是否可以通过在numbers 列表中添加任意数量的任意时间来生成。

例如 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 传递给递归函数调用?这似乎没有任何区别。

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

【问题讨论】:

  • 该死,我只是想检查memo 是如何构建的,导致错误,没有它一切正常,谢谢。

标签: python recursion


【解决方案1】:

考虑当您调用canSum(0, [2]) 时,该函数将返回文字True。和if canSum(0, [2]) == True 条件将得到满足。但是当您调用canSum(2, [2]) 时,该函数将返回一个(True, {2: True}) 的元组并且if canSum(2, [2]) == True 的条件将不被满足。所以当你调用canSum(4, [2])时,函数会返回(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

【讨论】:

  • 我想知道写这行代码是否真的有什么好处:memo[target_sum] = True。我认为它只会执行一次,将它存储在备忘录中是没有意义的。有人请告诉我我是对的还是遗漏了什么。
猜你喜欢
  • 2016-08-20
  • 2020-05-14
  • 2016-04-09
  • 2015-11-13
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多