所以我正在尝试自己学习python,并且正在编写谜题。我遇到了一个几乎要求排队以赢得比赛的最佳位置。参加比赛的人摆脱了站在奇数位置的人。
因此,例如,如果1,2,3,4,5
它将摆脱奇数位置离开2,4
将摆脱剩下的奇数位置,留下4作为胜利者。
当我调试时,代码似乎正在运行,但它返回[1,2,3,4,5]
而不是预期的[4]
这是我的代码:
def findWinner(contestants):
if (len(contestants) != 1):
remainingContestants = []
for i, contestant in enumerate(contestants, 1):
if (isEven(i)):
remainingContestants.append(contestant)
findWinner(remainingContestants)
return contestants
我没有看到逻辑错误,或者还有其他我没有看到的东西?
答案 0 :(得分:3)
您必须将递归函数的值返回给调用函数:
return findWinner(remainingContestants)
否则您只返回原始值而不做任何更改。
def findWinner(contestants):
if (len(contestants) != 1):
remainingContestants = []
for i, contestant in enumerate(contestants, 1):
if (isEven(i)):
remainingContestants.append(contestant)
return findWinner(remainingContestants) # here the value must be return
return contestants # without the return above, it will just return this value(original)
答案 1 :(得分:3)
这个怎么样:
def findWinner(contestants):
return [contestants[2**int(math.log(len(contestants),2))-1]]
我知道它不是真正的问题,但我必须= P。我只是看看所有那些能够找到比参赛者少2的最大力量的工作而不是指出它。
或者如果您不喜欢“人工”解决方案并希望实际执行此过程:
def findWinner2(c):
while len(c) > 1:
c = [obj for index, obj in enumerate(c, 1) if index % 2 == 0] #or c = c[1::2] thanks desfido
return c
答案 2 :(得分:1)
你应该使用
return findWinner(remaingContestants)
否则,当然,你的清单永远不会更新,所以你的功能总是会返回包含
但是,请参阅PEP8以获取有关python代码的样式指南:http://www.python.org/dev/peps/pep-0008/
func isEven可能是一种矫枉过正......只需写一下
if not num % 2
最后,不建议在python中递归;做点什么
def find_winner(alist):
while len(alist) > 1:
to_get_rid = []
for pos, obj in enumerate(alist, 1):
if pos % 2:
to_get_rid.append(obj)
alist = [x for x in alist if not (x in to_get_rid)]
return alist
答案 3 :(得分:1)
您是否有理由在列表上进行迭代而不是使用切片?不使用它们对我来说似乎不太好。
此外,您可能希望在空列表的情况下做一些合理的事情。你现在将进入一个无限循环。
我将你的功能写成
def findWinner(contestants):
if not contestants:
raise Exception
if len(contestants)==1:
return contestants[0]
return findWinner(contestants[1::2])
(就像@ jon_darkstar的观点一样,这与你明确提出的问题有点相关,但仍然是一个很好的做法,可以参与你正在做的事情)
答案 4 :(得分:0)
您在“findWinner”
所在的行上错过了一次返回