//下边的代码可以输出各种组合,如果添加一个int全局变量就可以统计个数了。
//如果只统计个数可以用f(n,m)=f(n-1,m-1)+f(n-1,m);而不用拷贝数组、输出数组之类的~
//注意b free的位置,写错2次
//malloc(b)应该放在结束条件之后
#include <stdio.h>
#include <stdlib.h>
#define N 5
#define M 4
void f(int n,int m,int x,int *a)
{
int *b,i;
if (x == M)
{
for(i=0;i<M;i++)printf("%3d",a[i]);
printf("\n");
return;
}
if (n<m || m<=0)
{
return;
}
*(a+x) = n;
f(n-1,m-1,x+1,a);
b = (int *)malloc(sizeof(int)*M);
for (i=0;i<x;i++) *(b+i) = *(a+i);
f(n-1,m,x,b);
free(b);
}
void main()
{
int *a;
a = (int *)malloc(sizeof(int)*M);
f(N,M,0,a);
free(a);
}
//另一种解法。【用循环代替了一重递归】
#include <stdio.h>
#include <stdlib.h>
#define N 5
#define M 3
int sum;
void f(int n,int m,int *a)
{
int i,j;
for (i=n;i>=m;i--)//注意循环条件从n---m
{
a[m-1] = i;
if (m>1)
{
f(i-1,m-1,a);
}
else
{
for(j=M-1;j>=0;j--) printf("%3d",a[j]);
sum++;
printf("\n");
}
}
}
void main()
{
int *a;
a = (int *)malloc(sizeof(int)*M);
f(N,M,a);
printf("%3d\n",sum);
free(a);
}