0

我的任务是在 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

4 回答 4

1

由于您正在尝试以递归方式解决此问题,因此我认为您不需要该while循环。

当你试图递归地解决一个问题时,你需要两个部分:你需要一个完成一些工作的部分,你需要一个处理到达工作结束的部分。这是“基本情况”。

通常在解决此类问题时,如果您有一个零长度列表,您会立即找到基本情况。零长度列表的结果应该是什么?我会说0。

因此,这是一个将列表中的所有数字相加的函数的基本概要:

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

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

PS这似乎是家庭作业,所以我不想只给你代码。如果你真的自己弄清楚,记住这些东西会更容易。祝你好运!

于 2013-04-25T19:38:13.780 回答
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 中,它的效率会相当低,但无论如何都不建议在 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。:)

于 2013-04-25T20:10:51.420 回答
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))
于 2013-04-25T19:41:13.360 回答
0
while y<len(x)

所以最后一个y小于len(x)is y = len(x) - 1,所以它是列表的最后一项。

addodds2(x,y+1)

然后您尝试访问该项目之后的元素,该元素不存在,因此您得到 IndexError。

于 2013-04-25T19:32:00.487 回答