问题:已知有n个元素,求含m个元素的所有组合。
算法1:
其实很简单:
就是for嵌套改写为递归函数
for(i=0;i<5;i++){
for(j=i+1;j<6;j++){
for(k=j+1;k<7;k++){
printf 元素
}
}
}
下面的简单例子中给出7个元素中含3个元素的所有组合,使用的是递归函数
#include<stdio.h>
int num[]= {1,2,3,4,5,6,7},select[3],numLen=7,selectLen=3;
void combination(int numIndex,int selectIndex)
{
int i;
if(selectIndex==selectLen)
{
for(i=0; i<selectLen; i++)
{
printf("%d ",select[i]);
}
printf("\n");
return;
}
if(numIndex<numLen)
{
select[selectIndex]=num[numIndex];
combination(numIndex+1,selectIndex+1);
combination(numIndex+1,selectIndex);
}
}
int main(void)
{
combination(0,0);
return 0;
}
算法2:
前一种算法是多叉树的数据结构
算法2采用的是二叉树的递归,加入组合的元素可分两种情况:
1. 该元素不加入组合,那么数组的下标增加1
2.该元素加入组合,同样数组的下标增加1,保存该元素到select数组
#include<stdio.h>
int num[]= {1,2,3,4,5,6,7},select[3],numLen=7,selectLen=3;
void combination(int numIndex,int selectIndex)
{
int i;
if(selectIndex==selectLen)
{
for(i=0; i<selectLen; i++)
{
printf("%d ",select[i]);
}
printf("\n");
return;
}
if(numIndex<numLen)
{
select[selectIndex]=num[numIndex];
combination(numIndex+1,selectIndex+1);
combination(numIndex+1,selectIndex);
}
}
int main(void)
{
combination(0,0);
return 0;
}