【发布时间】:2015-04-16 20:07:59
【问题描述】:
所以我一直在研究这个家庭作业问题几个小时,我会尽力解释它。
我需要用 python 编写一个程序,它接受一个列表并从列表中的第一项开始,你可以向前移动一个空格或跳过一个项目并落在它的另一侧,每个项目你登陆费用该位置的号码。目标是尽可能便宜地到达终点。
这个函数是我写的,
def player(cost, board, player_pos):
if player_pos == (len(board)) - 1:
return cost
if player_pos < (len(board)) - 2:
if board[player_pos + 1] > board[player_pos + 2]:
return player(cost + board[player_pos + 2], board, player_pos + 2)
else:
return player(cost + board[player_pos + 1], board, player_pos + 1)
elif player_pos == (len(board)) - 2:
return (cost + board[player_pos] + board[player_pos + 1])
但是它看不到后面的两个位置,所以它可能会出错。一个很好的例子是这个列表 [0,1,2,1000,0] 我的程序输出 3,因为它选择 1 超过 2,然后选择 2 超过 1000,然后选择 0。这加起来是 3,但最快的方法是跳转到2,然后到 0。
在作业中它说运行长列表可能需要很长时间,我猜他们希望我尝试所有可能的跳跃组合并选择最便宜的一个,但我不知道如何使用递归。
编辑:所以这是我基于 cmets 所做的改进,它适用于我教授的所有示例。给了我除了一个,这是它没有返回他所说的应该返回的列表。 [0, 98, 7, 44, 25, 3, 5, 85, 46, 4] 他说应该返回 87,但我调整后的程序返回 124。这是新代码:
def player(cost, board, player_pos):
if player_pos == (len(board)) - 1:
return cost
if player_pos < (len(board)) - 2:
if (player(cost + board[player_pos + 2], board, player_pos + 2)) < (player(cost + board[player_pos + 1], board, player_pos + 1)):
return player(cost + board[player_pos + 2], board, player_pos + 2)
else: return player(cost + board[player_pos + 1], board, player_pos + 1)
elif player_pos == (len(board)) - 2:
return (cost + board[player_pos] + board[player_pos + 1])
【问题讨论】: