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