嗯,有一个非常简单和天真的递归解决方案来检索所有子集。
你从你的集合中取出一个元素,然后找到这个新的、更小的集合的所有子集。然后复制结果并将之前删除的元素添加到副本中。将结果加在一起就完成了。例如:
{1,2,3}
Take out 1 and find all subsets of {2,3} giving you:
{{}, {2}, {3}, {2,3}}
Now copy this to give you
A = {{}, {2}, {3}, {2,3}}
B = {{}, {2}, {3}, {2,3}}
Now add 1 to each set in A, giving you
{{1}, {1,2}, {1,3}, {1,2,3}}
combine it with B
{{1}, {1,2}, {1,3}, {1,2,3}, {}, {2}, {3}, {2,3}}
这里有一些代码:
function subsets(aSet) {
if (aSet.isEmpty()) {
return [theEmptySet]
}
let lastElement = aSet.getLast()
let aSmallerSet = aSet.removeLast()
let subsetsOfSmallerSet = subsets(aSmallerSet)
let subsetsContainingLastElement = subsetsOfSmallerSet.map(set => set.insert(lastElement))
return subsetsOfSmallerSet.concat(subsetsContainingLastElement)
}
我假设您的意思是获取给定数字的所有数字子集。因此,假设您已将数字拆分并将它们解析回数字,那么您可以使用 reduce 来获取产品。
let digits = //... an array such as [4,0,5]
let subsetsOfDigits = subsets(digits)
subsetsOfDigits.map(subset => subset.reduce((a,b) => a * b))
啊,但是这里你有一个空集的问题,因为你没有传递一个初始值来减少。但是,您似乎忽略了示例中的空集,因此您可以将其过滤掉,然后这段代码就可以工作了。