一、题目
请编写递归函数,求组合数。
函数原型
double Cmb(int x, int y);
说明:x 和 y 为非负整数,且 x≥y,函数值为组合数 Cxy。
裁判程序
#include <stdio.h>
double Cmb(int x, int y);
int main()
{
int m, n;
scanf("%d%d", &m, &n);
printf("%.10g\n", Cmb(m, n));
return 0;
}
/* 你提交的代码将被嵌在这里 */
要求:不要使用循环语句,不调用阶乘函数和排列数函数。找出递推公式,该函数直接调用自己求得结果。
输入样例
4 2
输出样例
6
输入样例2
34 17
输出样例2
2333606220
二、分析
递归求组合数可以用杨辉三角的形式来写,但是效率太低容易时间超限。
本题要求高效递归,利用公式将组合数上面的数化小,以提高计算效率。
递归部分不是使用杨辉三角的形式,而是写成 return x*Cmb(x-1,y-1)/y;
可以理解成公式提取一项出来乘上剩下减去1的部分。
完整代码如下。
double Cmb(int x, int y)
{
if(x<0||y<0||y>x) return 0;
if(y>x-y) return Cmb(x,x-y);
if(y==0||x==y) return 1;
return x*Cmb(x-1,y-1)/y;
}