咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 395|回复: 0

[python] python利用递归方法实现求集合的幂集

[复制链接]
  • TA的每日心情
    无聊
    2019-5-27 08:20
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    发表于 2020-10-4 12:35:43 | 显示全部楼层 |阅读模式
    什么是集合的幂集?
    就是原集合中所有的子集(bai包括全集du和空集)构成的集族。可数集是zhi最小的无限集; 它的幂集和实数dao集一一对应(也称同势),是不可数集。
    不是所有不可数集都和实数集等势,集合的势可以无限的大。如实数集的幂集也是不可数集,但它的势比实数集大。 设X是一个有限集,|X| = k,则X的幂集的势为2的k次方。
    代码
    1. def powSet(S):
    2. #创建列表a存储S中的元素
    3. a=[]
    4. for i in S:
    5.   a.append(i)
    6. #判断S中是否只有一个元素,作为递归的终点
    7. if len(a)==1:
    8.   return set([frozenset(),frozenset(a)])
    9. powset=set()
    10. #遍历S中的每一个元素
    11.         for i in range(len(a)):
    12.   S.remove(a[i])
    13.   temp = set()
    14. #取S中的这一个元素去掉,得到集合S的下一层(相当于S-1),认为S-1幂集已知。
    15. #将去掉的元素与S-1幂集中每一个元素都求并,得到新集合temp,temp和S-1的幂集求并便得到S的幂集
    16.   for j in powSet(S):
    17.    temp.add(j.union({a[i]}))
    18.    powset = powSet(S).union(temp)
    19.   S.add(a[i])
    20. return powset
    21. #验证
    22. s=set([1,2,3])
    23. print(powSet(s))
    24. #结果
    25. {{frozenset({2}), frozenset({2, 3}), frozenset({1, 2}), frozenset({1, 2, 3}), frozenset({3}), frozenset({1}), frozenset(), frozenset({1, 3})}}
    复制代码
    需要知识
    幂集的概念
    python set 和 frozenset 数据类型
    心得体会
    笔者在写代码时遇到的问题是认为powSet(S-1)(S-1代表S中去掉任一个元素)就完完全全地替代了真正去掉那一个随机元素的元素组成的幂集。
    实际上这样是不完全的,因为设置的递归规则有缺陷,不可能完全遍历所有情况。
    解决:借助于集合元素的不可重复添加这一特性,我们可以遍历遍历所有S中的元素,都让它们进行一次递归操作,这样做虽然会产生n(S)次重复,但是它可以考虑到所有情况。
    到此这篇关于python利用递归方法实现求集合的幂集的文章就介绍到这了,更多相关python递归方法求集合的幂集内容请搜索咔叽论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持咔叽论坛!

    原文地址:https://www.jb51.net/article/195059.htm

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2024-3-28 19:13

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表