请用C语言实现两种方法:递归和非递归,来计算组合数c(n, m),其中递归方法基于公式c(n, m) = c(n-1, m) + c(n-1, m-1),非递归方法则是利用阶乘公式n! / (m!(n-m)!)。请分别为这两种情况提供相应的代码实现。
时间: 2024-10-23 20:13:54 浏览: 32
c 语言实现杨辉三角代码示例
在C语言中,我们可以分别使用递归和非递归的方式来计算组合数c(n, m)。
**递归实现(基于公式):**
```c
#include <stdio.h>
int comb_recursive(int n, int m) {
// 基本情况:当m=0或m=n时,组合数为1
if (m == 0 || m == n)
return 1;
else
// 根据公式:c(n, m) = c(n-1, m) + c(n-1, m-1)
return comb_recursive(n - 1, m) + comb_recursive(n - 1, m - 1);
}
int main() {
int n, m;
printf("Enter n and m: ");
scanf("%d %d", &n, &m);
printf("Combination of %d choose %d is: %d\n", n, m, comb_recursive(n, m));
return 0;
}
```
**非递归实现(利用阶乘公式):**
```c
#include <stdio.h>
#include <math.h>
// 计算阶乘
long long factorial(int num) {
long long fact = 1;
for(int i = 1; i <= num; ++i)
fact *= i;
return fact;
}
// 非递归计算组合数
long long comb_iterative(int n, int m) {
return factorial(n) / (factorial(m) * factorial(n - m));
}
int main() {
int n, m;
printf("Enter n and m: ");
scanf("%d %d", &n, &m);
printf("Combination of %d choose %d is: %lld\n", n, m, comb_iterative(n, m));
return 0;
}
```
阅读全文