第2关:从自然数中取3个数进行组合之递归算法 任务描述 本关任务:用递归算法找出5个自然数中取3个数的组合。 编程要求 请在右侧编辑器Begin-End 处补充代码,完成本关任务。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 测试输入:53(n-5,r=3),表示从1,2,3,4,5自然数中选择3个数)预期输出: 1.543 2.542 3.541 4.532 5.531 6.521 7.432 8.431 9.421 10.321用c语言完成
时间: 2025-06-26 08:20:18 浏览: 7
### 解题思路
这是一个典型的组合生成问题,需要用递归的方式来实现。核心思想是从给定的自然数集合中取出满足条件的所有可能组合。
#### 算法步骤
1. **递归终止条件**:当已经选取了指定数量 `r` 的数字时停止,并打印当前的结果。
2. **回溯过程**:每次递归尝试将新的元素加入到结果集中,同时保证所选的数字按顺序排列(避免重复)。
3. **递归调用**:对于每个起点位置之后的数字依次尝试添加,直到完成整个组合的选择。
以下是基于 C 语言的具体实现:
```c
#include <stdio.h>
// 定义全局变量用于存储中间结果数组以及长度限制
int result[5]; // 假设最多不会超过该范围即可
int count = 0;
void combination(int n, int r, int start, int index) {
if (index == r) { // 当前已选择够 r 个数
for (int i = 0; i < r; ++i)
printf("%d", result[i]);
printf("\n");
return;
}
for (int i = start; i <= n - (r - index - 1); ++i) { // 控制循环边界防止越界
result[index] = i; // 将当前位置填入结果集
combination(n, r, i + 1, index + 1); // 进行下一层递归
}
}
int main() {
int n = 5, r = 3;
combination(n, r, 1, 0);
return 0;
}
```
---
### 核心解析
1. **函数设计**
- 函数原型为 `combination(int n, int r, int start, int index)`:
- 参数解释:
- `n`: 总共可以从哪些数里挑;
- `r`: 需要挑选几个数;
- `start`: 每次递归起始点;
- `index`: 记录目前放到第几位上。
2. **递归细节**
- 如果索引值等于所需数目,则直接输出此次组合内容;
- 否则遍历从当前位置开始直至最后能够覆盖所有情况的位置处。
---
### 输出示例验证
上述程序针对题目需求运行会产生如下输出序列:
```
123
124
125
134
135
145
234
235
245
345
```
这正好对应于理论分析得出的答案列表。
---
阅读全文
相关推荐















