使用C++编写一段程序,用递归法求组合数
时间: 2024-02-18 10:05:07 浏览: 93
好的,下面是使用C++编写的递归法求组合数的程序:
```c++
#include <iostream>
using namespace std;
int C(int n, int m) {
if (m == 0 || m == n) {
return 1;
} else {
return C(n-1, m) + C(n-1, m-1);
}
}
int main() {
int n, m;
cout << "请输入n和m的值(n>=m):" << endl;
cin >> n >> m;
cout << "C(" << n << "," << m << ")=" << C(n, m) << endl;
return 0;
}
```
在上述代码中,我们定义了一个C函数,用于递归求解组合数。在主函数中,我们首先输入n和m的值,然后调用C函数求解组合数,并输出结果。
需要注意的是,上述代码中并没有对输入的n和m进行合法性检查,因此在实际应用中需要进行相应的判断。
相关问题
用c++编写一个程序,使用递归法方法计算n!
在C++中,你可以使用递归的方式来编写一个计算阶乘的程序。下面是一个简单的示例:
```cpp
#include <iostream>
// 递归函数,计算n的阶乘
unsigned long long factorial(int n) {
if(n == 0) { // 递归终止条件:0的阶乘是1
return 1;
} else {
// 递归调用自身,n! = n * (n-1)!
return n * factorial(n - 1);
}
}
int main() {
int num;
std::cout << "请输入一个正整数:";
std::cin >> num;
// 检查输入是否合法
if(num < 0) {
std::cout << "错误:输入值必须是非负整数。\n";
} else {
try {
unsigned long long result = factorial(num);
std::cout << " " << num << "! 的结果是:" << result << "\n";
} catch(std::overflow_error& e) {
std::cout << "错误:计算结果过大,超过数值范围。\n";
}
}
return 0;
}
```
这个程序首先询问用户输入一个正整数,然后递归计算其阶乘。如果输入的数太小(即0或1),直接返回1作为基本情况。当n大于1时,递归地将n乘以(n-1)!。需要注意的是,由于阶乘的增长速度非常快,对于较大的n,可能会导致数值溢出,因此需要处理可能出现的`std::overflow_error`异常。
使用c++编写程序,用递归法解决Hanoi塔问题
Hanoi塔问题是经典的递归问题,它涉及三个柱子和一组大小不等的圆盘。目标是将所有圆盘从第一个柱子移动到第三个柱子,每次只能移动一个圆盘,并且任何时候都不能让大盘子位于小盘子之上。以下是使用C++递归实现Hanoi塔问题的一个简单示例:
```cpp
#include <iostream>
void hanoi(int n, char fromRod, char toRod, char auxRod) {
if (n > 0) {
// 将前n - 1个盘子从起始位置移动到辅助位置
hanoi(n - 1, fromRod, auxRod, toRod);
// 然后将最大的盘子直接移动到目标位置
std::cout << "Move disk " << n << " from rod " << fromRod << " to rod " << toRod << "\n";
// 最后将前n - 1个盘子从辅助位置移动到目标位置
hanoi(n - 1, auxRod, toRod, fromRod);
}
}
int main() {
int numDisks = 3; // 可以为任意正整数
hanoi(numDisks, 'A', 'C', 'B'); // A表示起始柱子,C表示目标柱子,B表示辅助柱子
return 0;
}
```
在这个代码中,`hanoi`函数是一个递归函数,当n为1时,我们直接移动;当n大于1时,会先递归地移动n-1个盘子到辅助柱子,再移动最大的盘子到目标柱子,最后把剩下的n-1个盘子移动到目标柱子上。
阅读全文