我的任务是在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))
答案 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。 :)