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讓程式碼執行。

這個……只用到 combination,沒有用到 permutation 的知識吧?不過內容很棒,學到 isset 的新用法~
回覆刪除