星期四, 11月 25, 2010

Cm取n

這一篇是在 這邊看到的討論
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 == '$var'.($i-1)).($i == '' ' + 1').'; $var'.$i.' < $m; $var'.$i.'++)'."\r\n";
                }

                
$source .= 'self::calc(';
                for (
$j 0$j $n$j++) {
                        
$source .= ($j == '' '.').'$str[$var'.$j.']';
                }
                
$source .= ');';

                return 
$source;
        }
        
private static function calc ($s)
        {
                echo 
'{'.$s.'}';
        }
}
Cmn::output(55);
?>




原理就是動態產生每一層的排列組合程式碼,再使用eval讓程式碼執行。