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

问题描述:

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

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)) 
+5

由于它是递归的,你可能不想要一个循环。想想你的基本情况。你什么时候只返回一个值,而你什么时候需要返回一个包含下一个递归调用结果的值。 – 2013-04-25 19:33:29

+0

我希望这是作业,因为使用递归这在现实生活中会很糟糕。 – cmd 2013-04-25 19:39:58

你的代码应该是(注释说明我更正):

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)) 

while y<len(x) 

所以最后ylen(x)越小y = len(x) - 1,所以它在列表的最后一个项目。

addodds2(x,y+1) 

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

由于您试图递归解决这个问题,我不认为你需要那个while循环。

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

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

所以,这里是一个函数的基本轮廓,以在列表中添加的所有数字相加:

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

得到这个工作,然后修改它,所以它只添加奇数值。

P.S.这看起来像功课,所以我不想只给你代码。如果你真的想出了自己的想法,记住这些东西会更容易。祝你好运!

这个代码可以很短,优雅:

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。 :)