abcd 的幂集是abc、abd、acd 的幂集的并集(加上集abcd 本身*)。
P(`abcd`) = {`abcd`} + P(`abc`) + P(`abd`) + P(`acd`) + P(`bcd`)
* 注意 空集,它是 P(abcd) 的成员,也是 P(abc)、P(abd)、...的成员,所以等价上述成立。
递归地,P(abc) = {abc} + P(ab) + P(ac),以此类推
第一种方法,在伪代码中,可能是:
powerset(string) {
add string to set;
for each char in string {
let substring = string excluding char,
add powerset(substring) to set
}
return set;
}
当字符串为空时递归结束(因为它永远不会进入循环)。
如果您真的想要 no 循环,则必须将该循环转换为另一个递归。
现在我们要从abc生成ab、ac和cb
powerset(string) {
add string to set;
add powerset2(string,0) to set;
return set
}
powerset2(string,pos) {
if pos<length(string) then
let substring = (string excluding the char at pos)
add powerset(substring) to set
add powerset2(string,pos+1) to set
else
add "" to set
endif
return set
}
另一种方法实现一个递归函数P,它要么从参数中删除第一个字符,要么不删除。 (这里+表示集合并集,.表示连接,λ是空字符串)
P(abcd) = P(bcd) + a.P(bcd)
P(bcd) = P(cd) + b.P(cd)
P(cd) = P(d) + c.P(d)
P(d) = λ+d //particular case
然后
P(d) = λ+d
R(cd) = P(d) + c.P(d) = λ + d + c.(λ+d) = λ + d + c + cd
R(bcd) = P(cd) + b.P(cd) = λ + d + c + cd + b.(λ + d + c + cd)
= λ + d + c + cd + b + bd + bc + bcd
P(abcd) = λ + d + c + cd + b + bd + bc + bcd
+ aλ + ad + ac + acd + ab + abd + abc + abcd
如果允许循环,则P 将失去电源设置功能。否则,我们将需要一个单参数无循环函数来将给定字符连接到给定字符串集(这显然是两个东西)。
可以通过使用String.replace 进行一些调整(如果需要String 结果,或者将Set 替换为List (这样“附加”参数实际上是列表中的第一个元素) )。