2014-12-03 79 views
1

鑑於函數all_subsets(lst),我該如何使用遞歸編寫此函數?如何使用遞歸編寫all_subsets函數?

例如輸入的:[1,2,3],輸出應該是:[[], [1],[2],[3],[1,2],[1,3],[2,3][1,2,3]]

分配是使用遞歸函數。請幫忙。這是實驗任務的一部分,所以我沒有對此進行評分,但同時,我渴望學習如何編寫這些代碼,並且我不知道我的實驗班中有誰知道如何編寫代碼。

到目前爲止,我有:

def all_subsets(b): 
    if len(b) == 0: 
     return '' 
    else: 
     lst = [] 
     subsets = all_subsets(b[1:]) 
     for i in b: 
      lst.append([i]) 
     for i in subsets: 
      if b[0] not in i: 
       lst.append([b[0]] + i) 
     for i in subsets: 
      if b[1] not in i: 
       lst.append([b[1]] + i) 
     return lst 

它可以處理[1,2,3],但它不能處理還有更大的;加上這段代碼也有奇怪的輸出順序

+5

請參閱http://stackoverflow.com/help/how-to-ask。所有詢問代碼的問題都需要展示提問者自己嘗試解決問題的過程。之後,我們將非常樂意幫助解決您遇到的任何具體問題。 – iCodez 2014-12-03 18:39:33

+0

迭代可能比Python中的遞歸更習慣,這是一個很好的用例。 – 2014-12-03 18:51:21

+0

@Paulo:或者使用'itertools'作爲單行:'itertools.chain.from_iterable(map(functools.partial(itertools.combinations,lst),range(len(lst)+1)))' – Kevin 2014-12-03 19:03:53

回答

1

這應該工作:

def all_subsets(b): 
    if len(b)==1: 
     return [[], b] # if set has 1 element then it has only 2 substets 
    else: 
     s = all_subsets(b[:-1]) # calculate subsets of set without last element 
     # and compose remaining subsets 
     return sorted(s + [e + [b[-1]] for e in s], key=len) # you can omit sorting if you want 
+0

謝謝這麼多 – 2014-12-03 19:43:13

+0

這將幫助我提高我的遞歸編碼。你是最棒的。 – 2014-12-03 19:43:32