从数组取出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)。
*/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }