昨天上课,一同学说的一个题目,连说了好几个,一个都不会,呵呵,没事就研究了其中的一个求子集算法,很久没碰数论了,都快忘了什么是子集,所以在接下来的文字之前,还是先说说我对“子集”的理解吧:
一堆苹果,去任意个(0个或者全部)分成任意组,问一共有多少种分法?
不要问算法是怎么来的,你花1个多小时在纸上测试100多个“1234”之后估计就知道了,不是有人说过,成功=99%努力+1%运气,大概也就是这个意思了,不过,如果你要是演算了几百个1234还是总结不出你的算法的话,估计你就要注意那个公式后面的一句话了:1%运气 > 99%努力
如果掌握的子集的生成规律,基本上就得出了算法,而我的算法也正是源于发现了如下的规律:
(先不考虑空集的情况,那个太没技术含量了)
先看1的子集:(1)
再看2的子集:(1);(2);(1,2)
(3的情况我就不写了,上面这个足于说明规律了,然后有兴趣的自己推3去)
简单描述:
首先,要求2的子集,先要得到1的子集(代码中设为oldList)
接着,在oldList的基础上先加入当前数(也就是2了),得到了:(1);(2)
最后,当前数2与oldList进行一个**操作得到剩下的子集部分。
**操作描述如下:
2 ** (1)
2加在括号外面:(1)(2)
2加在括号里面:(1,2)
于是,就得到了2的子集:(1);(2);(1)(2);(1,2)
如果是:3 ** (1)(2)
结果就是:
3加在括号外面:(1)(2)(3)
3加在括号里面:(1)(2,3);(1,3)(2) - 也就是说每个集合都单独算一次
恩,有些难描述,由于明天还有复考,剩下的就是只能贴个代码给大家自己研究了,使用js脚本语言写的,大家直接复制粘贴保存为html文件打开即可。

Code
<style>
h4{widht:100%;text-align:center;}
div{margin:5;float:left;height=100%;border:1px #00ced1 dashed;width=48%;padding:10px;color:#2f4f4f;font-size:14px;line-height:180%;word-wrap:break-word;}
</style>
<h4>请输入一个正整数:<input type="text" value=3 /><input type="button" value="确定" onclick="Go()" /></h4>
<div></div>
<div></div>
<script>
var v = document.getElementsByTagName("DIV");
function Go(){
var i = document.getElementsByTagName("INPUT")[0];
var n = i.value;
if(!n.match(/^\d+$/)){
alert("大连民族学院6号公寓611幼儿园辅导班永远欢迎您的到来!");
return;
}
if(n>10){
alert("做好死机准备吧,嘿嘿~~");
}
v[1].innerHTML = "调试输入:<br />"
var arr = S(n).split(";");
var h = "结果如下:<br />";
h += "1:空集<br />"
for(var i in arr){
h += (parseInt(i)+2)+":("+arr[i].replace(/\|/g,") (")+")<br />";
}
v[0].innerHTML = h;
}
function S(n){
if(n==1){
v[1].innerHTML += "返回"+n+"的结果:1<br />";
return "1";
}
var oldList = S(n-1);
var newList = n;
var arr = oldList.split(';');
for(var i in arr){
var d = arr[i];// d 的格式为:1或1,2或1|2或1,2|3,分别表示:(1)或(1,2)或(1)(2)或(1,2)(3)
var l = d.length;
newList += ";"+d+"|"+n;
newList += ";"+d+","+n;
for(var j=l-1; j>0; j--){
if(d.charAt(j)=="|"){
var pre = d.substring(0,j);
var fix = d.substring(j+1,l);
newList += ";"+pre+","+n+"|"+fix;
}
}
}
var reList = oldList + ";" + newList;
v[1].innerHTML += "返回"+n+"的结果:"+reList+"<br />";
return reList;
}
</script>