C語言排列組合算法可以通過遞歸實現。下面是一個示例代碼:
#include <stdio.h>
void combination(int arr[], int data[], int start, int end, int index, int r) {
if (index == r) {
for (int i = 0; i < r; i++) {
printf("%d ", data[i]);
}
printf("\n");
return;
}
for (int i = start; i <= end && end - i + 1 >= r - index; i++) {
data[index] = arr[i];
combination(arr, data, i + 1, end, index + 1, r);
}
}
void permutation(int arr[], int data[], int start, int end) {
if (start == end) {
for (int i = 0; i <= end; i++) {
printf("%d ", data[i]);
}
printf("\n");
return;
}
for (int i = start; i <= end; i++) {
int temp = arr[start];
arr[start] = arr[i];
arr[i] = temp;
permutation(arr, data, start + 1, end);
temp = arr[start];
arr[start] = arr[i];
arr[i] = temp;
}
}
int main() {
int arr[] = {1, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
int r = 2;
int data[r];
printf("Combination:\n");
combination(arr, data, 0, n - 1, 0, r);
printf("Permutation:\n");
permutation(arr, data, 0, n - 1);
return 0;
}
在上面的代碼中,combination
函數用來計算組合,permutation
函數用來計算排列。arr
數組存儲原始數據,data
數組存儲當前的組合或排列結果。start
和end
參數用來指定當前需要處理的數組范圍,index
參數用來指定當前已經選擇了幾個數。r
參數用來指定需要選擇多少個數進行組合或排列。
在combination
函數中,我們使用了回溯法,通過遞歸實現組合算法。在每一層遞歸中,我們從start
到end
的范圍內選擇一個數,并將其保存到data
數組中,然后遞歸調用combination
函數,繼續選擇下一個數,直到選擇了r
個數為止。
在permutation
函數中,我們使用了回溯法,通過遞歸實現排列算法。在每一層遞歸中,我們將arr[start]
與arr[i]
交換位置,然后遞歸調用permutation
函數,繼續處理下一個位置,直到處理完了所有位置為止。
在main
函數中,我們定義了一個示例數組arr
和選擇的個數r
,并調用combination
和permutation
函數進行計算,并輸出結果。