Php 每次使用相同的选项获得x数量斑点的所有唯一组合
我不确定正确的术语,但我需要一个程序,为固定数量的选项和可变数量的点提供所有独特的组合,例如:Php 每次使用相同的选项获得x数量斑点的所有唯一组合,php,algorithm,loops,unique,combinations,Php,Algorithm,Loops,Unique,Combinations,我不确定正确的术语,但我需要一个程序,为固定数量的选项和可变数量的点提供所有独特的组合,例如: 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: "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";
}
}
}
$options=数组(“a”、“b”、“c”);
对于($x=0;$x<3;$x++){
打印“$options[$x]\n”;
对于($y=$x;$y<3;$y++){
打印“$options[$x]$options[$y]\n”;
对于($z=$y;$z<3;$z++){
打印“$options[$x]$options[$y]$options[$z]\n”;
}
}
}
我的另一个成功尝试是将生成的组合放入数组,对该数组进行排序,将该数组转换为字符串,并检查该字符串是否已存在于包含所有已接受组合字符串的数组中。这似乎效率极低,我希望有更好的方法。我强烈建议不要使用外部函数,因为我希望在PHP和循环等方面做得更好 您可以使用递归(这假设您在选项数组中只有唯一的字符,如果没有,则必须先执行该操作):
函数打印组合(&$options,$max,$index=0,$prefix=''){
如果($前缀)
打印“$prefix\n”;
如果($max),这里有一个不需要引用的生成器实现
function permutations($alphabet, $max, $prefix = '') {
$alphabetRemaining = $alphabet;
if ($prefix) {
yield $prefix;
}
if ($max <= 0) {
return;
}
foreach ($alphabet as $alpha) {
yield from permutations($alphabetRemaining, $max - 1, $prefix . $alpha);
array_shift($alphabetRemaining);
}
}
foreach (permutations(["a", "b", "c"], 3) as $perm) {
echo "$perm\n";
}
函数置换($alphabet,$max,$prefix=''){
$alphabetRemaining=$alphabet;
如果($前缀){
产生$prefix;
}
if($max)如果你使用递归并不难。谢谢,我是编程新手,所以没听说过。我会看看我能走多远。好吧,既然没有人回答,现在我可以向你展示如何…哇,谢谢allot,没想到它会这么简单,但它非常有效。那些递归函数肯定会成为我其他项目中的一个方便工具。:-)生成器函数对我来说也是一个新概念,所以我会尽可能地研究它的用法和优点。没有引用,但效率也不高。引用比复制整个数组然后移动它要好。对吗?不,不一定。@maraca PHP引用不是指针,PHP变量也不是简单的内存块。PHP引用是令人困惑的,经常会导致代码行为不正常,通常没有人们认为的性能优势。需要注意的是,许多使用引用的PHP内置函数确实具有所有这些优势,因为它是在C语言中编译的,在后台充满了优化和实际指针。@Sammitch如果不修改没有理由每次调用都复制所有内容。PHP是写时复制,仅供参考。
function permutations($alphabet, $max, $prefix = '') {
$alphabetRemaining = $alphabet;
if ($prefix) {
yield $prefix;
}
if ($max <= 0) {
return;
}
foreach ($alphabet as $alpha) {
yield from permutations($alphabetRemaining, $max - 1, $prefix . $alpha);
array_shift($alphabetRemaining);
}
}
foreach (permutations(["a", "b", "c"], 3) as $perm) {
echo "$perm\n";
}
a
aa
aaa
aab
aac
ab
abb
abc
ac
acc
b
bb
bbb
bbc
bc
bcc
c
cc
ccc
function permutations($alphabet, $max, $prefix = '') {
$alphabetRemaining = $alphabet;
if ($prefix) {
yield $prefix;
}
if ($max <= 0) {
return;
}
foreach ($alphabet as $alpha) {
yield from permutations($alphabetRemaining, $max - 1, $prefix . $alpha);
}
}
foreach (permutations(["a", "b", "c"], 3) as $perm) {
echo "$perm\n";
}
a
aa
aaa
aab
aac
ab
aba
abb
abc
ac
aca
acb
acc
b
ba
baa
bab
bac
bb
bba
bbb
bbc
bc
bca
bcb
bcc
c
ca
caa
cab
cac
cb
cba
cbb
cbc
cc
cca
ccb
ccc