递归找到最小的解决方案

时间:2019-02-15 06:20:00

标签: python-3.x recursion

我正在使用一个接受数字列表并递归计算该列表中最低的和的代码。到目前为止,这是我的代码:

def jumpIt(board, i):
  n = len(board)
  if i>n-1:
    return 0
  elif i+1>n-1:
    return board[i]
  else:
    if board[i]<board[i+1]:
        return board[i] + jumpIt(board,i+1)
    else:
        return board[i+1] + jumpIt(board,i+2)

def main():
  file = open("input.txt", "r")
  for line in file:
    numbers = line.split() 
    gameBoard = list(map(int, numbers))

    min_cost = jumpIt(gameBoard, 1)
    print(min_cost)
file.close()

main()

该代码通过比较列表中两个数字的索引并添加结果较小的一个来工作。我遇到的问题是与[0、5、10、20、2、3]之类的数字列表有关。我的代码当前计算出最便宜的成本为20(5 + 10 + 2 + 3),而更好的解决方案是跳过5并直接跳到10,这将使我获得15的总和。如何更改代码适应这样的解决方案?

1 个答案:

答案 0 :(得分:0)

首先,我对为什么您对jumpIt的调用从索引1而不是索引0开始感到困惑。

您似乎已经实现了一个“贪婪”的解决方案,该解决方案假定在每个步骤中选择两个选择元素中较小的一个将带来最佳效果。这样,我们就错过了递归的潜在功能来回答我们的问题,“哪条路更好?”

我们要说的是,“我们不知道哪条路更好,请告诉我。”我们可以这样做:

替换:

# I already know what's best
if board[i] < board[i+1]:
  return board[i] + jumpIt(board, i+1)
else:
  return board[i+1] + jumpIt(board, i+2)

具有:

# I don't know which one is better, please tell me
return min(
  board[i] + jumpIt(board, i+1),
  board[i+1] + jumpIt(board, i+2)
)