【发布时间】:2015-10-27 04:24:36
【问题描述】:
拥有集合 {a,b,c} 我想以递归方式找到所有子集。 我已经使用位掩码解决了这个问题,但我想了解一个人在这个 youtube 视频 here
中所说的方式还有其他关于这个问题的 stackoverflow 线程,但我没有找到任何解决她在视频中陈述的方式的方法,她说,
“取 a 和 b 的子集,克隆它们,然后将 c 添加到所有克隆中”
我无法想象可以实现此目的的“简单”递归方法。递归方法是否一旦用尽,就拥有 A、B 的所有子集和 A、B 的克隆(此时重复),然后传播回来,只将 C 添加到克隆?
换句话说,我从集合上的一个 for 循环开始,我调用我的递归函数,然后我执行一个 n-1 的 for 循环并在该 for 循环中调用我的递归方法,我看不出我怎么能得到将 C 添加到正在使用递归构建的数组中已存在的子集克隆中。
function SubsetBuilder(set) {
this.set = set;
}
SubsetBuilder.prototype.getSubsetsRecursive = function () {
//Set = {a,b,c}
//take the subsets of a and b, clone them and then add c to all the clones
//subsets of {a,b}=
//{}
//{a}
//{b}
//{a,b}
var n = this.set.length;
var result = [];
var recurseForSubsets = function (prefix, index) {
for (var i = index; i < n -1; i ++) {
result.push(prefix + this.set[i]);
recurseForSubsets(prefix + this.set[i], i + 1);
}
}
for (var j = 0; j < n; j++) {
recurseForSubsets("", j);
}
return result;
}
SubsetBuilder.prototype.printSubsets = function () {
var self = this;
if (!self.set)
return;
var n = this.set.length;
for (var i = 0; i < (1 << n) ; i++) {
var subset = [];
for (var j = 0; j < n; j++) {
if (((i >> j) & 1) === 1) { // bit j is on
subset.push(this.set[j]);
}
}
console.log(subset);
}
}
var set = ['a', 'b', 'c'];
var obj = new SubsetBuilder(set);
//obj.printSubsets();
console.log(obj.getSubsetsRecursive());
【问题讨论】:
标签: javascript algorithm recursion