c语言递归:有五个数,随机组合后输出四个。下面代码中的函数用了递归,但我看不懂...麻烦好心人花时

c语言递归:有五个数,随机组合后输出四个。下面代码中的函数用了递归,但我看不懂...麻烦好心人花时间解释一下...万分感谢...

第1个回答  推荐于2016-10-11
//id combine(int a[], int n, int m, int b[], int M);
  
//参数:
//a 存放候选数字
//n 总项数
//m 取出项数
//b 存放选出结果
//M  = m
#include "stdio.h"
#define MAX 100
void combine(int a[], int n, int m, int b[], int M);
int main(void)
{
 int i;
 int a[MAX], b[MAX];
 for (i = 1; i < 100; i++)
  a[i - 1] = i;
 combine(a, 5, 4, b, 4);
}
void combine(int a[], int n, int m, int b[], int M)

    int i, j;
    for (i = n; i >= m; i--)
    {
        b[m - 1] = i - 1;
        if (m > 1)
            combine(a, i - 1, m - 1, b, M);
        else
        {
            for (j = M-1; j >= 0; j--)//控制个数
                printf("%d ", a[b[j]]);
            printf("\n");
        }
    }
}本回答被提问者采纳
第2个回答  2015-11-04
void combine(int a[], int n, int m, int b[], int M)
//从a数组的前n个元素中选出m个元素,放入b中(共M个)
{
int i, j;
for (i = n; i >= m; i--)//每次选最大的数,穷举其可能值为n..m(因为共要选m个)
{
b[m - 1] = i - 1; //已选定了本轮第m小的数为a[i-1]
if (m > 1) //如还有未选的数
combine(a, i - 1, m - 1, b, M); //从a数组的前i-1个元素中选出m-1个元素,放入b else //已全部选出本轮的M个数
{
for (j = M-1; j >= 0; j--)//输出已选定的M个数,b[j]记录该数在a[]中的下标
printf("%d ", a[b[j]]);
printf("\n");
}
}
}
相似回答