递归方法返回原始值

时间:2010-11-09 16:46:58

标签: python recursion

所以我正在尝试自己学习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

我没有看到逻辑错误,或者还有其他我没有看到的东西?

5 个答案:

答案 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”

所在的行上错过了一次返回