Python中的递归函数在List中添加奇数值

时间:2013-04-25 19:28:33

标签: python

我的任务是在Python中创建一个递归函数,它以列表和值0作为输入,然后将列表中的所有奇数相加并返回该值。下面是我拥有的代码,并且它一直返回列表索引超出范围。无论我做什么,我都无法让它发挥作用。

def addodds2(x,y):
    total=0
    a=x[y]
    while y<len(x):
        if a%2!=0:
            total+=a
            return(addodds2(x,y+1))
        else:
            return(addodds2(x,y+1))
    return(total)
print(addodds2([3,2,4,7,2,4,1,3,2],0))

4 个答案:

答案 0 :(得分:1)

由于您试图以递归方式解决此问题,因此我认为您不希望while循环。

当您尝试递归地解决问题时,您需要两个部分:您需要一个能完成某些工作的部件,并且您需要一个处理到达工作结束的部件。这是“基础案例”。

通常在解决这样的问题时,如果你有一个零长度列表,你会立即点击基础案例。零长度列表的结果应该是什么?我会说0。

所以,这是将一个列表中的所有数字加在一起的函数的基本概要:

检查长度,如果您已经在结尾或结束之后,则返回0.否则,返回添加到递归调用中的当前项目(索引值递增)。

让它工作,然后修改它,使它只添加奇数值。

P.S。这看起来像是作业,所以我不想只给你代码。如果你自己弄清楚这个东西,那么记住这些东西会更容易。祝你好运!

答案 1 :(得分:0)

while y<len(x)

因此,小于y的最后len(x)y = len(x) - 1,因此它是列表中的最后一项。

addodds2(x,y+1)

然后你尝试在那个不存在的项目之后访问元素,这样你就得到了IndexError。

答案 2 :(得分:0)

您的代码应该是(评论解释我的更正):

def addodds2(x,y):
    total=0
    if y<len(x):    #you don't need a while there
        a=x[y]      #you have to do this operation if y<len(x), otherwise you would get the index error you are getting
        if a%2!=0:
            total+=a
        return total+addodds2(x,y+1)    #you have to sum the current total to the result returned by the addodds2() function (otherwise you would got 0 as the final result)
    return total

print(addodds2([3,2,4,7,2,4,1,3,2],0))

答案 3 :(得分:0)

此代码可以非常简短和优雅:

def add_odds(lst, i=0):
    try:
        return (lst[i] if lst[i] % 2 == 0 else 0) + add_odds(lst, i+1)
    except IndexError:
        return 0

请注意,在真正的功能样式中,您也不会跟踪索引。但是在Python中,它的效率会相当低,但无论如何都不建议使用递归。

def add_odds2(lst):
    try:
        return (lst[-1] if lst[-1] % 2 == 0 else 0) + add_odds2(lst[:-1])
    except IndexError:
        return 0

要使其适用于任何类型的序列,您可以执行以下操作:

def add_odds3(it):
    it = iter(it)
    try:
        value = next(it)
        return (value if value % 2 == 0 else 0) + add_odds3(it)
    except StopIteration:
        return 0

它的效率要高得多,尽管递归使用迭代器没有多大意义......

我意识到这很少与您的(教育)目的相关,但我只想展示(全部)你一些不错的Python。 :)