我不确定使用的术语正确,但是我需要一个程序,该程序可以为固定数量的选项提供可变数量的所有唯一组合,例如:
options: "a", "b", "c"
max spots: 3
output:
a
a a
a b
a c
a a a
a a b
a b b
a a c
a c c
a b c
b
b b
b c
b b b
b b c
b c c
c
c c
c c c
我目前有一些代码,但是我不知道如何使它可变地扩展以容纳更多地点。通常,它会将组合放入数组中,而不是将其打印出来,然后将该数组用于其他计算。
$options = array("a", "b", "c");
for ($x = 0; $x < 3; $x++) {
print "$options[$x]\n";
for ($y = $x; $y < 3; $y++) {
print "$options[$x] $options[$y]\n";
for ($z = $y; $z < 3; $z++) {
print "$options[$x] $options[$y] $options[$z]\n";
}
}
}
我的另一项成功的尝试是将生成的组合放入一个数组中,对该数组进行排序,将该数组转换为字符串,并检查该字符串是否已经包含所有可接受的组合字符串。这似乎效率极低,我希望有更好的方法。我强烈不希望使用外部函数,因为我想在PHP和循环等方面变得更好。
您可以使用递归到达那里(假设您在选项数组中只有唯一的字符,如果没有,则必须先这样做):
function printCombinations(&$options, $max, $index = 0, $prefix = '') {
if ($prefix)
print "$prefix\n";
if ($max <= 0)
return;
for ($i = $index; $i < count($options); $i++) {
printCombinations($options, $max - 1, $i, $prefix . ' ' . $options[$i]);
}
}
您可以这样称呼:printCombinations(['a', 'b', 'c'], 3);
。因为我们有点枚举组合,所以我们不会得到任何重复(除非$ options具有重复)。
这将为您提供,a b
但不会给您b a
,因此必须按顺序选择元素,这似乎是您的列表所指示的内容。上面的电话应该会给您确切的列表(顺序略有不同)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句