2013-04-25 142 views
0

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

回答

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)) 
0
while y<len(x) 

所以最後ylen(x)越小y = len(x) - 1,所以它在列表的最後一個項目。

addodds2(x,y+1) 

然後嘗試該項目,不存在後訪問元素,讓您得到IndexError。

1

由於您試圖遞歸解決這個問題,我不認爲你需要那個while循環。

當您嘗試以遞歸方式解決問題時,需要兩個部分:您需要一個完成一些工作的部分,並且需要一個可以處理工作結束的部分。這是「基礎案例」。

通常當解決這樣的問題時,如果你有一個零長度的列表,你立即打基礎案例。零長度列表應該是什麼結果?我想說0

所以,這裏是一個函數的基本輪廓,以在列表中添加的所有數字相加:

檢查長度,如果你已經在結束或結束後,返回0.否則,返回添加到遞歸調用中的當前項目(索引值遞增)。

得到這個工作,然後修改它,所以它只添加奇數值。

P.S.這看起來像功課,所以我不想只給你代碼。如果你真的想出了自己的想法,記住這些東西會更容易。祝你好運!

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