在数学术语中,您要求输入集的所有可能的非空有序子集.在在线整数序列百科全书中,此类序列的数量显示为
sequence A007526 – 请注意,此序列以4,15,64,325开头,与您发现的完全一致.
这个问题在Python中承认了一个非常简短,有效的解决方案,因此我将首先发布该解决方案:
def gen_nos(s):
for i in sorted(s):
yield i
s.remove(i)
for j in gen_nos(s):
yield i+j
s.add(i)
例:
>>> list(gen_nos(set(['a', 'b', 'c'])))
['a', 'ab', 'abc', 'ac', 'acb', 'b', 'ba', 'bac', 'bc', 'bca', 'c', 'ca', 'cab', 'cb', 'cba']
请注意,排序并非严格必要;它只是确保输出按字典顺序排序(否则,元素按设定顺序迭代,这基本上是任意的).
要将其转换为PHP,我们必须使用带有额外数组参数的递归函数来保存结果:
function gen_nos(&$set, &$results) {
for($i=0; $i
$results[] = $set[$i];
$tempset = $set;
array_splice($tempset, $i, 1);
$tempresults = array();
gen_nos($tempset, $tempresults);
foreach($tempresults as $res) {
$results[] = $set[$i] . $res;
}
}
}
例:
$results = array();
$set = array("a", "b", "c");
gen_nos($set, $results);
var_dump($results);
产生
array(15) {
[0]=>
string(1) "a"
[1]=>
string(2) "ab"
[2]=>
string(3) "abc"
[3]=>
string(2) "ac"
[4]=>
string(3) "acb"
[5]=>
string(1) "b"
[6]=>
string(2) "ba"
[7]=>
string(3) "bac"
[8]=>
string(2) "bc"
[9]=>
string(3) "bca"
[10]=>
string(1) "c"
[11]=>
string(2) "ca"
[12]=>
string(3) "cab"
[13]=>
string(2) "cb"
[14]=>
string(3) "cba"
}