【发布时间】:2015-11-21 06:53:41
【问题描述】:
我正在为我的一个 CS 课程解决一个问题,并且我非常有信心我有正确的想法,只是在我实施它时我没有得到正确的答案。
游戏是:有两个玩家,以及一个数字列表(即 [3,7,8,1,6,4,5])。每个玩家轮流从列表的任一端选择一个数字。一旦选择了一个数字,它就会从列表中删除,然后对手可以从这个新列表中选择他们想要的结果。目标是在列表为空时获得最大的数字总和。
我的想法:假设我们从简单的列表 [1,2,3,4,5] 开始。当玩家 1 从开头或结尾选择一个数字(1 或 5)时,我们现在有一个较小的列表可供对手选择。所以让我举一个使用这个列表的例子:
我选择5。新的列表是[1,2,3,4],对手可以选择。我不知道他们会选择列表的哪一端,但我知道它只能是1或4. 如果是 1,那么当再次轮到我时,我剩下 [2,3,4]。如果他们选择 4,我就剩下 [1,2,3]。如果我选择 1,它们会留下 [2,3],如果我选择 3,它们会留下 [1,2],依此类推,直到列表中没有数字。对手也在尽最大的努力获得最高分,所以他们不会一直贪婪地选择更大的数字。玩家同样聪明,所以他们都会使用完全相同的策略来为自己获得最高分。
这是一个每次在较小列表上的明显递归问题。
注意:我不是在寻找要给出的代码。由于这是一门 cs 课程,我真的更愿意得到关于我可能做错了什么的提示,以便我可以学习而不是得到代码。
这是我写的代码:
def Recursive(A):
# check if there is only one item left. If so, return it
if len(A) == 1:
return A[0]
# take the left item and recurse on the list if the opponent
# were to take the left side, and the list if the opponent
# were to take the right number
takeLeftSide = A[0] + max(Recursive(A[1:-1]), Recursive(A[2:len(A)]))
takeRightSide = A[-1] + max(Recursive(A[0:-2]), Recursive(A[1:-1]))
return max(takeLeftSide, takeRightSide)
if __name__ == '__main__':
A = [5,8,1,3,6]
print Recursive(A)
我相信我应该期待 12,但在某些情况下,我的输出结果是 19 和 14。
感谢您的帮助,我已经为此工作了好几个小时,我知道一旦您尝试深入研究递归,事情就会变得混乱和混乱。
【问题讨论】:
-
我不确定您要做什么。显然您实际上并没有两个玩家,您只是根据一些逻辑进行选择。
Recursive()应该返回什么? -
这看起来不像是我自然会使用递归的东西。
-
返回一个玩家可以获得的最大总和。我不确定如何真正添加玩家,因为我无法向该方法添加另一个参数
-
它不需要递归,空列表在布尔表达式中计算为
False,因此您可以使用while循环。 -
我的意思是你实际上并没有创建一个供两个人玩的游戏,它只是一个查找玩家可以获得的最高分数的函数。