找出n个自然数(1,2,3,……,n)中取r个数的组合 找出n个自然数(1,2,3,……,n)中取r个数的组合

 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=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