组合数的递归函数
关于一道组合数的依次计算,但是需要利用递归函数去调用,题目如下:
看到这道题,最开始的思路是利用基本的计算方法,分子依次相乘,除以分母依次相乘
下面展示一些 内联代码片
。
//
#include<stdio.h>
int fun(int n, int i);
int main(){
int n;
scanf("%d",&n);
for(int i = 0;i <= n;i++){
if(i != n)
printf("%d,",fun(n,i));
else
printf("%d",fun(n,i));
}
return 0;
}
int fun(int n, int i){
int zi = 1,mu = 1;
int m = 1;
if(i == 0 || i==n)
return 1;
else{
for(int op = 0;op < i;op++){
zi = zi * n;
n--;
}
for(int op2 = 0;op2 < i;op2++){
mu = mu * m;
m++;
}
return zi/mu;
}
}
发现并无法利用函数递归,于是反思计算过程,最后回想起高中的数学公式:
C(n , k) = C (n - 1, k) + C ( n - 1 , k - 1) //注意n是下方数字
实现代码如下:
#include<stdio.h>
int fun(int n, int i);
int main(){
int n;
scanf("%d",&n);
for(int i = 0;i <= n;i++){
if(i != n)
printf("%d,",fun(n,i));
else
printf("%d",fun(n,i));
}
return 0;
}
int fun(int n, int i){
if(i == 0 || i==n)
return 1;
else return fun( n-1 , i)+ fun(n-1 , i-1); //直接套入公式即可
}
由此可见,在这种情况下,函数体的递归调用大大减轻编程难度。