函数 if True 返回组合列表

问题描述

我正在关注一个动态编程视频。但是,对于下面显示的给定数字集,返回为 False。它应该显示 [3,4]

如果我将“组合”更改为 True。它将返回 True。但是我想显示组合。

combo = list()

def howsum(targetsum,numbers):
    if targetsum == 0: return combo
    if targetsum < 0: return False
    
    for number in numbers:
        remainder = targetsum - number
        combo.append(number)
        
        if howsum(remainder,numbers) == True: return combo
    return False
     
print(howsum(7,[3,4])) #output should be [3,4]

解决方法

这里的问题是您正在检查返回值是否为 True,而不是它是否存在。空集合的真实性是 False,非空集合的真实性是 True。同样对于回溯,您需要从当前组合中 pop() 尝试替代方案。

combo = list()
def howsum(targetsum,numbers):
    if targetsum == 0: return combo
    if targetsum < 0: return False

    for number in numbers:
        remainder = targetsum - number
        combo.append(number)
        if howsum(remainder,numbers): return combo
        combo.pop()
    return False


print(howsum(7,[3,4]))  # output should be [3,4]

还有一点要注意。我们可以通过引入辅助函数将其作为参数传递,而不是创建全局 combo 列表。

def howsum_helper(targetsum,numbers,combo):
    if targetsum == 0: return combo
    if targetsum < 0: return False

    for number in numbers:
        remainder = targetsum - number
        combo.append(number)
        if howsum_helper(remainder,combo): return combo
        combo.pop()
    return False

def howsum(targetsum,numbers):
    return howsum_helper(targetsum,[])

print(howsum(7,4]

此解决方案还假设数字列表中的数字可以重复到达 targetSum