【问题标题】:Recursion in PythonPython中的递归
【发布时间】:2013-02-18 22:54:49
【问题描述】:

问题在于编写递归函数“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
>>> 

【问题讨论】:

  • “出了点问题。”请编辑您的问题,说明 什么 有问题。
  • 请分享你的程序的输出,以及你是如何运行它的。
  • 您正在从EhMensuravel 函数中的for 循环返回。这意味着它只会使用j = 0i = 0(除非len(weights) 为0,在这种情况下,函数将返回None,因为内部循环不会运行)。
  • 但是我该如何解决呢?我认为当我返回 EhMensuravel(entry, weights[1:], final_weight) "weights[1:]" 也是错误的,但我不知道如何解决它

标签: python recursion


【解决方案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。

【讨论】:

  • 请注意,当需要递归时 wasserfeder 没有实现迭代,我认为您不能在迭代期间实现递归,因为迭代本身就是递归的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2013-12-11
  • 2012-11-24
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多