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))
你的代码应该是(注释说明我更正):
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)
所以最后y
比len(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。 :)
由于它是递归的,你可能不想要一个循环。想想你的基本情况。你什么时候只返回一个值,而你什么时候需要返回一个包含下一个递归调用结果的值。 – 2013-04-25 19:33:29
我希望这是作业,因为使用递归这在现实生活中会很糟糕。 – cmd 2013-04-25 19:39:58