2015-11-05 59 views
1

我是Python3的新手,正在嘗試做遞歸powerset函數。它應該使用列表理解。Powerset遞歸,列表理解python3

我寫道:

def powerset(seq): 
    if not seq: 
     return [[]] 
    return powerset(seq[1:]) + [[seq[0]] + n for n in powerset(seq[1:])] 

此功能,但我得到的反饋,被告知這是沒有必要調用該函數兩次。它做了很多計算。它應該很容易能夠計算多達20個電力。那我該怎麼辦?沒有兩次調用函數,我無法使它工作。謝謝。

+2

你知道如何將一個函數的返回值保存到一個變量中,然後使用該變量嗎? – user2357112

+0

你的意思是類似res + = res + [[seq [0] + n for powerset(seq [1:])]其中res是一個空列表?還是我完全錯了? – blik3o

+0

不幸的是,完全錯誤。你知道'subset = powerset(seq [1:])'意思嗎? – user2357112

回答

0

纔算powerset(seq[1:])一次,它存儲在一個變量,並使用它兩次:

def powerset(seq): 
    if not seq: 
     return [[]] 
    ps = powerset(seq[1:]) 
    return ps + [[seq[0]] + n for n in ps] 

到你不同的是,這樣一來,你使用ps兩次,但你計算它只是一旦。


或者,你可以使用雙列表理解(如果你喜歡那種事情......)

def powerset(seq): 
    return [x for ps in powerset(seq[1:]) for x in ([seq[0]] + ps, ps)] if seq else [[]] 

這裏,同樣的臨時變量ps是內部列表定義理解。但是,請注意,這樣的結果會略有不同。


我覺得很不清楚。我其實不明白如何將它分配給一個變量可以改變?它意味着同樣的事情?

你在這裏純粹的數學方面似乎思考得太多。在編程中,y = f(x)並不意味着「y與f(x)相同/同義」,而是「將f(x)的結果賦值給y」。

+1

雙嵌套列表解析幾乎總是可以簡化爲單列表解析。在這種情況下,對於(子集,[seq [0]] + subset)]'中的x,它將是[[x for powerset(seq [1:])中的子集)。 – user2357112

+0

但是,如何將它存儲在一個只寫出變量的變量中有什麼不同?它做同樣的事情對嗎?而且我不熟悉雙嵌套列表理解。 「+ ps,ps」是什麼意思(不是powerset(seq [1:]))?這不是說太多的功能嗎? – blik3o

+0

@ user2357112是的,我在想這樣的事情,但不知何故弄亂了它。現在修復。 –