免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1549 | 回复: 4
打印 上一主题 下一主题

[算法] 问一道算法题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-03 20:55 |只看该作者 |倒序浏览
Write a recursive function to output all subsets of elements.  for  example, the subsets of the three-element set {a, b, c} are {}(empty set), [a}, {b}, {c},{a, b}, {a,c}, {b,c}, {a,b,c}

我知道怎么用非递归解决这个问题,但递归想了下没想出来。

论坛徽章:
0
2 [报告]
发表于 2006-03-03 21:11 |只看该作者
我的 blog  上有一个贴子讨论了如何生成不同的组合,一个子集其实就是一个组合,所以可以用生成不同组合的方法来得到全体子集。设你的集合有 n 个元素,只要取其大小为0 的子集合(组合),大小为 1 的(组合),...., 大小为 n 的子集(组合) 就行了.

另一种方法称为比特集,其想法为把 n 个元素对应到 n 个 bit 上去,bit 为1 表示元素出现,bit 为 0表示元素不出现。这些 bits 的 2^n 个状态恰好与 2^n 个子集对应。比如全0表示空集,全1表示全集合。而 2^n 个比特可以对应成一个整数,所以把一个整数从0增长到 2^n-1,起 bit 模式就刻画了所有子集。


我前面给出的第一种方法可看作是某种形式的递归。

[ 本帖最后由 win_hate 于 2006-3-3 21:13 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-03-03 21:25 |只看该作者
这是一本算法书上第一章的题, 应该用不到这些离散数学的知识,我估计用几个循环和递归就可以解决了

论坛徽章:
0
4 [报告]
发表于 2006-03-03 21:31 |只看该作者
若要单纯的递归,应该很简单:

A={a, b....} 的子集有两类,一类含  a,一类 不含 a,后者是 A\{a}={b...} 的子集。只要递归到 A\{a} 上,就得到了第二类。然后把 a 第插入第二类,得到第一类就行了。


ps> 我前面提到的算法也就是几个循环而已。

论坛徽章:
0
5 [报告]
发表于 2006-03-03 21:43 |只看该作者
对 就是这样的!
谢谢了 斑竹
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP