题目: 组合数
请编写递归函数,求组合数
说明:x 和 y 是任意整数。若 x ≥ y ≥ 0,则函数值为组合数
C
x
y
否则函数值为 0。
// 求组合数(递归版)
double Cmb(int x, int y);
裁判程序
#include <stdio.h>
// 求组合数(递归版)
double Cmb(int x, int y);
int main()
{
int m, n;
scanf("%d%d", &m, &n);
printf("%g\n", Cmb(m, n));
return 0;
}
/* 你提交的代码将被嵌在这里
我的代码(低效版)
double Cmb(int x, int y)
{
if( x < 0 || y < 0 || x < y )
{
return 0;
}
if( y == 0 || x == y )
{
return 1;
}
if( x >= y && y >= 0 )
{
return Cmb( x - 1, y ) + Cmb( x - 1, y - 1 );
}
}
我的代码(高效版)
double Cmb(int x, int y)
{
double m;
if( x < 0 || y < 0 || y > x )
{
m = 0;
}
else if( y == 0 )
{
m = 1;
}
else if( y > x / 2 )
{
y = x - y;
m = Cmb( x , y );
}
else
{
m = x * Cmb( x - 1, y - 1) / y;
}
return m;
}
知识点&&代码闪光点&&思路
1.低效版实则就是参考杨辉三角(任意一个数的值等于其上方两个数之和(塔顶元素和每一排首尾元素值为1))
由于是初学递归算法,个人总结了自己写递归的思路
- 首先把特殊的情况表示出来
- 其次找出所求的解与前面几项的关系(类似于数学中的通项公式)
- 调试程序
2.高效版则是运用了数学方面的知识,
当n的值过大时,通过转换将n变为n = m - n,大量的减少了计算量,使代码达到高效