我正在研究一种算法来获得像
这样的排列123
132
213
231
312
321
我正在使用嵌套的foreach循环。
for (..) {
for(..) {
for(..) {
echo $i . $j . $k . "<br />";
}
}
}
问题是那些嵌套循环的#是针对3点排列进行优化的。 如何动态设置嵌套for循环的数量以生成4个字母或5个字母的排列?
答案 0 :(得分:4)
是的,只是递归地做。
function permuteThis($items, $permutations = array()) {
if(!is_array($items))
$items = str_split($items);
$numItems = sizeof($items);
if($numItems > 0) {
$cnt = $numItems - 1;
for($i = $cnt; $i >= 0; --$i) {
$newItems = $items;
$newPerms = $permutations;
list($tmp) = array_splice($newItems, $i, 1);
array_unshift($newPerms, $tmp);
permuteThis($newItems, $newPerms);
}
} else {
echo join('', $permutations) . "\n";
}
}
$number = 123;
permuteThis($number);
答案 1 :(得分:2)
递归方法是要走的路。但您也可以使用eval
函数:
$loop = iteration('i',10) . iteration('j',10). iteration('k',10). iteration('l',10);
$loop .= "print \"\$i \$j \$k \$l\\n\";";
// $loop now has: for($i=0;$i<10;$i++)for($j=0;$j<10;$j++)for($k=0;$k<10;$k++)for($l=0;$l<10;$l++) print "$i $j $k $l\n";
eval($loop);
function iteration($var,$limit) {
return "for(\${$var}=0;\${$var}<$limit;\${$var}++)";
}
答案 2 :(得分:1)
不,不,请不要使用递归来生成排列。使用概述的here算法,另请参阅php implementation
答案 3 :(得分:0)
答案是:使用递归函数。
答案 4 :(得分:0)
您可以使用递归函数。看一下这个post。