Python中的递归回溯——在标尺上平衡权重

Python中的递归回溯——在标尺上平衡权重,python,recursion,backtracking,Python,Recursion,Backtracking,问题:假设秤的一侧有一个砝码。给定一组其他权重,看看天平是否平衡。您可以在任意一侧使用权重,而不必使用所有权重 在我当前的解决方案中,我在每个级别上有3个分支。第一个将数组中的第一个权重添加到“左”侧,第二个将其丢弃,第三个将其添加到“右”侧。我的问题似乎是,在完成第一个分支后,如果所有分支都显示为False,它将返回False。相反,我希望它转到下一个分支 让我想到这一点的是,当我有权重=[4,1]和初始权重=3时,它给了我错误的信息(说它不能平衡),但当我将权重的顺序翻转为[1,4]时,它给

问题:假设秤的一侧有一个砝码。给定一组其他权重,看看天平是否平衡。您可以在任意一侧使用权重,而不必使用所有权重

在我当前的解决方案中,我在每个级别上有3个分支。第一个将数组中的第一个权重添加到“左”侧,第二个将其丢弃,第三个将其添加到“右”侧。我的问题似乎是,在完成第一个分支后,如果所有分支都显示为
False
,它将返回
False
。相反,我希望它转到下一个分支

让我想到这一点的是,当我有
权重=[4,1]
初始权重=3
时,它给了我错误的信息(说它不能平衡),但当我将权重的顺序翻转为
[1,4]
时,它给了我正确的信息

我昨天刚开始学习Python,所以我猜我缺少了一些语法上的微妙之处。但这绝对不排除算法问题

def balanceable_rec(L, R, weights):

    print("L =", L, "  R =", R, "  weights =", weights)

    if (L == 0  or  L==R  or L in weights):
        return True
    if (len(weights) == 0):
        return False

    w = weights.pop(0)
    if balanceable_rec(L + w, R, weights):  return True
    if balanceable_rec(L, R, weights):      return True
    if balanceable_rec(L, R + w, weights):  return True

    return False


def balanceable(w, weights):
    return balanceable_rec(w, 0, weights)


# ----------------------

# weights = [1,4]
weights = [4,1]
init_weight = 3

if (balanceable(init_weight, weights)):     print("That can be balanced!")
else:           print("That cannot be balanced!")
以下是输出:

L=3 R=0权重=[4,1]

L=7 R=0权重=[1]

L=8 R=0权重=[]

L=7 R=0权重=[]

L=7 R=1权重=[]

L=3 R=0权重=[]

L=3 R=4权重=[]

这是不平衡的


您需要将
weights
的副本传递给递归调用,以便
pop
调用不会影响原始
weights
对象,例如:

def balanceable_rec(L, R, weights):

    print("L =", L, "  R =", R, "  weights =", weights)

    if (L == 0  or  L==R  or L in weights):
        return True
    if (len(weights) == 0):
        return False

    w = weights.pop(0)
    if balanceable_rec(L + w, R, weights[:]):  return True
    if balanceable_rec(L, R, weights[:]):      return True
    if balanceable_rec(L, R + w, weights[:]):  return True

    return False

谢谢,这解决了我的问题。所以这里的教训是Python默认情况下通过引用而不是复制来传递东西?@shortake56:这基本上就是您遇到的问题,尽管我认为从技术上讲Python不通过引用传递东西,但有些东西略有不同,请参见