http://twpug.net/modules/newbb/viewtopic.php?viewmode=flat&type=&topic_id=5542&forum=13
Cm取n
下列是C5取1到C5取5所有排列組合...
第一層{1}{2}{3}{4}{5}
第二層{12}{13}{14}{15}{23}{24}{25}{34}{35}{45}
第三層{123}{124}{125}{134}{135}{145}{234}{235}{245}{345}
第四層{1234}{1235}{1245}{1345}{2345}
第五層{12345}
<?php
class Cmn
{
public static function output ($m, $n)
{
// $str = range('A', 'E');
$str = range(1, $n);
for ($i = 1; $i <= $n; $i++) {
eval(self::createSource($i));
echo "\r\n";
}
}
private static function createSource ($n)
{
for ($i = 0; $i < $n; $i++) {
$source .= 'for ($var'.$i.' = '.($i == 0 ? 0 : '$var'.($i-1)).($i == 0 ? '' : ' + 1').'; $var'.$i.' < $m; $var'.$i.'++)'."\r\n";
}
$source .= 'self::calc(';
for ($j = 0; $j < $n; $j++) {
$source .= ($j == 0 ? '' : '.').'$str[$var'.$j.']';
}
$source .= ');';
return $source;
}
private static function calc ($s)
{
echo '{'.$s.'}';
}
}
Cmn::output(5, 5);
?>
原理就是動態產生每一層的排列組合程式碼,再使用eval讓程式碼執行。