写出递归和非递归算法,输出n个自然数1,2....n的 三个数的组合序列。(18分)c语言
时间: 2024-11-27 15:16:18 浏览: 10
递归算法练习.pdf
递归算法通常用于解决可以分解为更小部分的问题,对于寻找三个数的组合序列,我们可以考虑从数组的第一个元素开始,依次选择后续的两个元素组成组合。这里是一个简单的C语言递归函数示例:
```c
#include <stdio.h>
void find_combinations(int arr[], int n, int start, int current, int* result) {
if (current == 3) {
printf("%d %d %d\n", arr[start], arr[start + 1], arr[start + 2]);
return;
}
for (int i = start; i <= n - 2; i++) {
result[current] = arr[i];
find_combinations(arr, n, i + 1, current + 1, result);
}
}
int main() {
int numbers[] = {1, 2, 3, 4, 5}; // 假设这是n个数字,实际替换为n值
int n = sizeof(numbers) / sizeof(numbers[0]);
int combinations[3];
find_combinations(numbers, n, 0, 0, combinations);
return 0;
}
```
非递归算法则需要借助循环和存储结构来避免无限递归。我们可以使用一个二维数组或者动态内存来储存所有可能的组合,然后逐个打印出来。这是一个非递归的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 5 // 你可以根据需要调整最大值
#define COMB_SIZE 3
void generate_combinations(int arr[], int n, int index, int comb[]) {
if (index >= COMB_SIZE) {
print_combination(comb);
return;
}
for (int i = 0; i < n - index; i++) {
comb[index] = arr[i];
generate_combinations(arr + i + 1, n - index - 1, index + 1, comb);
}
}
void print_combination(int comb[]) {
for (int i = 0; i < COMB_SIZE; i++) {
printf("%d ", comb[i]);
}
printf("\n");
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
int n = sizeof(numbers) / sizeof(numbers[0]);
int combinations[COMB_SIZE][n];
generate_combinations(numbers, n, 0, combinations);
return 0;
}
```
阅读全文