1 <?php 2 /** 3 * 对于$n和$r比较小, 可以用这种方法(当n=5, r=3时) 4 */ 5 function permutation1($n, $r) 6 { 7 for($i=1; $i<=$n-$r+1; ++$i) 8 { 9 for($j=$i+1; $j<=$n-$r+2; ++$j) 10 { 11 for($k=$j+1; $k<=$n-$r+3; ++$k) 12 { 13 echo $i . '-' . $j . '-' . $k . '<br/>'; 14 } 15 } 16 } 17 } 18 19 /** 20 * 在n个元素中找出r个元素的排列,结果保存在res中,tmp为某个排列的临时变量 21 */ 22 function permutation2($n, $r, &$res, &$tmp) 23 { 24 for($i=$n; $i>=$r; --$i) 25 { 26 $tmp[] = $i; 27 if($r>1) 28 { 29 permutation2($i-1, $r-1, $res, $tmp); 30 } else {//$r=1, 这时保存结果 31 $res[] = $tmp; 32 } 33 //回溯 34 array_pop($tmp); 35 } 36 } 37 38 permutation1(5,3); 39 $res = array(); 40 $tmp = array(); 41 permutation2(5,3,$res,$tmp); 42 echo "<pre>"; 43 print_r($res);
找出n个自然数(1,2,3,……,n)中取r个数的组合
例如,当n=5,r=3时,所有组合为:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5