1. 程式人生 > 程式設計 >python利用遞迴方法實現求集合的冪集

python利用遞迴方法實現求集合的冪集

什麼是集合的冪集?

就是原集合中所有的子集(bai包括全集du和空集)構成的集族。可數集是zhi最小的無限集; 它的冪集和實數dao集一一對應(也稱同勢),是不可數集。

不是所有不可數集都和實數集等勢,集合的勢可以無限的大。如實數集的冪集也是不可數集,但它的勢比實數集大。 設X是一個有限集,|X| = k,則X的冪集的勢為2的k次方。

程式碼

def powSet(S):
 #建立列表a儲存S中的元素
 a=[]
 for i in S:
  a.append(i)
 #判斷S中是否只有一個元素,作為遞迴的終點
 if len(a)==1:
  return set([frozenset(),frozenset(a)])
 
 powset=set()
 #遍歷S中的每一個元素
 	for i in range(len(a)):
  S.remove(a[i])
  temp = set()
 #取S中的這一個元素去掉,得到集合S的下一層(相當於S-1),認為S-1冪集已知。
 #將去掉的元素與S-1冪集中每一個元素都求並,得到新集合temp,temp和S-1的冪集求並便得到S的冪集
  for j in powSet(S):
   temp.add(j.union({a[i]}))
   powset = powSet(S).union(temp)
  S.add(a[i])
 return powset
 #驗證
s=set([1,2,3])
print(powSet(s))

#結果
{{frozenset({2}),frozenset({2,3}),frozenset({1,2}),frozenset({3}),frozenset({1}),frozenset(),3})}}

需要知識

冪集的概念

python set 和 frozenset 資料型別

心得體會

筆者在寫程式碼時遇到的問題是認為powSet(S-1)(S-1代表S中去掉任一個元素)就完完全全地替代了真正去掉那一個隨機元素的元素組成的冪集。

實際上這樣是不完全的,因為設定的遞迴規則有缺陷,不可能完全遍歷所有情況。

解決:藉助於集合元素的不可重複新增這一特性,我們可以遍歷遍歷所有S中的元素,都讓它們進行一次遞迴操作,這樣做雖然會產生n(S)次重複,但是它可以考慮到所有情況。

到此這篇關於python利用遞迴方法實現求集合的冪集的文章就介紹到這了,更多相關python遞迴方法求集合的冪集內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!