2012-03-27 60 views
5

這是一個非常簡單的代碼來代替更大的問題,但我希望我可以解決它大塊。我將從我的第一個問題開始。遞歸函數和列表追加/擴展

def testrecurse(z,target): 
    x=[] 
    if z<target: 
     z*=2 
     x.append(z) 
     x.extend(testrecurse(z,target)) 
    return x 

這是一個測試函數,以幫助我的大腦與遞歸。它需要一個數字,然後顯示兩個數字的所有乘法,直到達到目標數字。所以,如果我進入:

testrecurse(1,1000) 

我收到:

[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024] 

這是偉大的!輸出看起來很好,很乾淨。但這是我的問題,我很難在我的輸出中追加或添加第一個值。這是我想要的輸出看起來像。

[1,2, 4, 8, 16, 32, 64, 128, 256, 512, 1024] 

我試圖改變

x=[] to x=[z] 

但後來我收到:

[1, 2, 2, 4, 4, 8, 8, 16, 16, 32, 32, 64, 64, 128, 128, 256, 256, 512, 512, 1024, 1024] 

任何幫助,將不勝感激,我是新來的遞歸,它使我的頭不疼。

+1

嘗試在乘以2之前追加,並改變'if z 2012-03-27 20:16:11

+0

哦,謝謝你,我沒有意識到這樣的簡單改變會解決它。 – Unknown 2012-03-27 20:22:58

回答

25

這個怎麼樣?

def testrecurse(z, target): 
    if z >= target: 
     return [] 
    return [z] + testrecurse(2 * z, target) 

例子:

>>> testrecurse(1, 1000) 
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512] 

注意,它不包含任何1024更多。如果你想要這個,第三行改爲

 return [z] 

當然,你通常不會寫這個遞歸方式,而是使用for環或itertools.takewhile()

+0

你知道嗎,我從來沒有想過連接列表,非常感謝你,我認爲它會幫助很多。 – Unknown 2012-03-27 20:21:16

+0

你先生,應該得到比你更多的喜歡 – SKandeel 2015-06-02 16:43:52