0

问题是关于编写一个递归函数“def EhMensuravel (target, weight)”,它确定是否可以在双盘天平上使用给定的一组权重来测量所需的目标值。可用的权重存储在“权重”列表中。请记住,砝码可以放在目标砝码所在的盘子的对面,也可以放在目标砝码的同一盘子上或不使用。

我做的代码是这样的,但是有问题。

weights = [1, 2, 3]
matrix = []

def createaMatrix():
    for i in range(len(weights)):
        matrix.append([])
    for j in range(3):
        for i in range(len(weights)):
            if j==0:
                matrix[j].append(weights[i])
            if j==1:
                matrix[j].append(-weights[i])
            if j==2:
                matrix[j].append(0)

createMatrix()


def EhMensuravel(entry, weights, final_weight=0):
    if final_weight == entry:
        return True
    for j in range(3):
        for i in range(len(weight)):
            final_weight += matrix[i][j]
            return EhMensuravel(entry, weight[1:], final_weight)

编辑:例如,当我尝试print EhMensuravel(4, weights)时,输出是:

>>> 
1
2
3
None
>>> 
4

1 回答 1

1

即使没有这样的全局矩阵,您也可以使递归非常简单

weights = [1, 2, 3]

def EhMensuravel(entry, weights, weight_idx = 0):
    if entry == 0:
        return True

    if weight_idx == len(weights):
        return False

    if EhMensuravel(entry + weights[weight_idx], weights, weight_idx+1):
        return True

    if EhMensuravel(entry - weights[weight_idx], weights, weight_idx+1):
        return True

    if EhMensuravel(entry, weights, weight_idx+1):
        return True

    return False

print EhMensuravel(4, weights)

第一个 if 语句只是说 0 是可测量的。第二个 if 只是确保还有权重。接下来的 3 次递归调用只是entry通过添加、减去或忽略当前权重来更新当前权重,并从下一个权重重新开始搜索。如果没有找到解决方案,则返回 False。

于 2013-02-18T23:34:46.623 回答