从数组取出n个元素的所有组合

//在所给的数组中找n个数的排列。
/*
arr为原始数组,re为保存输出下标的一位数组,start为开始找的起始点,count是数组re
的下标用于判断递归调用结束;
假如:arr= 1,2,3,4,5;n=4。
第一次调用:
start=0,count=3;
i=0;i<2;i++
re[3]=0;
re[3]=1;
然后在re的两个分支分别调用函数
第一个调用;
start=1;count=2;
i=1;i<3;i++
re[2]=1;
re[2]=2;
......
每次都是第一个调用的话可以得到
re[3]=0,re[2]=1;re[1]=2;re[0]=3;
输出arr[re[j]]正好是1 2 3 4;
解释:
为什么for循环循环的是len-count?
 因为递归函数是找的可以作为开头的数,比如
 1 2 3 4 5中找4个的排列;那么
 1 2 3 4及2 3 4 5是两个临界值,能作为开头的只有1 2;
 如果3作为开头最多只能找3个(3,4,5)。

*/

 1 # include <stdio.h>
 2 # include <string.h>
 3 int len;     //全局变量,len是一个常数,定值;
 4 int num;    //num是要找的nde 个数。
 5 void search(int arr[],int re[],int start,int count)
 6 {
 7     int i;
 8     for(i=start;i<len-count;i++)
 9     {
10         re[count]=i;
11         if(count == 0)
12         {
13             for(int j=num-1;j>=0;j--)
14             {
15                 printf("%d  ",arr[re[j]]);
16             }
17             printf("\n");
18         }
19         else
20             search(arr,re,i+1,count-1);
21     
22     }
23 }
24 int main()
25 {
26     int arr[100],re[100];
27     int i;
28     scanf("%d",&len);
29     for(i=0;i<len;i++)
30         scanf("%d",&arr[i]);
31     scanf("%d",&num);
32     search(arr,re,0,num-1);
33     return 0;
34 }
View Code

 

posted on 2013-08-05 10:29  随风浪子的博客  阅读(424)  评论(0编辑  收藏  举报

导航