2015-09-11 76 views
2

我有一個錯誤在我試圖添加到列表中數字序列遞歸。例如。如果輸入是[5,3,9],我[5 + 1,3 + 2,9 + 3]和輸出[6,5,12]。我想這樣做遞歸,所以我做的方式正在經歷並加入一個爲下面的列表中的小部分:Python列表遞歸改變

def add_position_recur(lst, number_from=0): 
    length = len(lst) 
    # base case 
    if (length <= 1): 
     lst = [x+1 for x in lst] 
     print "last is", lst 
    else: 
     lst = [x+1 for x in lst] 
     print "current list is", lst 
     add_position_recur(lst[1:], number_from) 
     return lst 

,但問題是,這一切確實是將1添加到列表的每個元素。錯誤在哪裏?這與我在基本情況下返回列表的方式有關嗎?

+0

是'用來做什麼的number_from'?它在你的代碼中沒有任何用處。並且請注意,當您執行'lst = ...'時,您正在更改'lst'以引用新列表。它不改變傳入的原始列表作爲參數 – user2718281

回答

1

當你遞減你的呼叫堆棧時,你創建一個新列表lst,這與你返回的內容不一樣,所以你只會在第一次調用時返回你應用到列表中的更改。該函數將失去進一步下降的所有更改:

>>> add_position_recur([1,2,3]) 
[2, 3, 4] 

這應該已經返回[2, 4, 6]
您需要考慮重組的出路,以獲得變化的名單。

return [lst[0]] + add_position_recur(lst[1:], number_from) 

,你需要​​3210在你的基本情況:

def add_position_recur(lst, number_from=0): 
    length = len(lst) 
    # base case 
    if (length <= 1): 
     lst = [x+1 for x in lst] 
     return lst 
    else: 
     lst = [x+1 for x in lst] 
     return [lst[0]] + add_position_recur(lst[1:], number_from) 
>>> add_position_recur([1,2,3]) 
[2, 4, 6] 

然而,這是一個相當複雜的方法來這個遞歸。基本情況是空的清單是慣用的,否則將頭部遞減並拖尾。所以,要考慮的事情,它使用number_from:(?)

def add_position_recur(lst, number_from=1): 
    if not lst: 
     return lst 
    return [lst[0]+number_from] + add_position_recur(lst[1:], number_from+1) 

>>> add_position_recur([1,2,3]) 
[2, 4, 6] 

這還具有以下優勢沒有改變lst

0

傳遞與

lst = [lst[0]] + add_position_recur(lst[1:], number_from)

嘗試更換add_position_recur(lst[1:], number_from)此外,沒有遞歸你可以做[x + i + 1 for i, x in enumerate(your_list)]

+0

'lst [0]'只是一個整數,假設你的意思是'[lst [0]] + ...' – AChampion

+0

當然,你是對的。 –

0

爲什麼你不這樣做,而是做這樣的事情:

def func(lon, after=[]): 
    if not l: 
     pass 
    else: 
     v = len(lon) + lon[-1] 
     after.append(v) 
     func(lon[:-1], after) 
     return after[::-1] 

你提供的例子的函數的輸出匹配你想要的。

0

目前,您只是加1到你的列表中的每個值。

lst = [x+1 for x in lst] 

相反,你應該增加一個變量,它將被添加到x中,每個迭代的x在lst中。

lst = [x+(lst.index(x)+1) for x in lst] 

此解決方案假定您要添加到X數量取決於它的位置相對於列表的開始列表,而不是依賴於X相對於第一個元素的位置,這是> 1。意思是,你想在下面的列表中的值2中加1或3嗎?上述解決方案增加了三個。

lst = [0.5, 0.1, 2, 3] 
+2

不要在[lst]中對[x +(lst.index(x)+1)進行操作,當它存在重複的項目時它不起作用,而且它也很慢。使用'enumerate':'[x +(i + 1)for i,x in enumerate(lst)]''。 –

+0

@DanD。甚至更好的是,使用'start'參數來'枚舉'以避免額外的算術:'[x + i for i,x in enumerate(lst,start = 1)]''。 – lvc