C语言 全排列递归
遵循大事化小,小事化了原則。
1.先確定最后一個位置有k(n)選擇,就變成了k-1(n-1)個數的全排列。
2.怎么確定最后一個位置放什么數?用循環
for (int i = 0; i < k; ++i) {
??????? int tmp = data[i];
??????? data[i] = data[k - 1];
??????? data[k - 1] = tmp;
3.確定最后一個數后對前面k-1個數用遞歸
? printPermutations(data, n, k - 1);
4.再把本次交換的兩個數換回來,以至于不影響另外兩個數的交換
? tmp = data[i];
??????? data[i] = data[k - 1];
??????? data[k - 1] = tmp;
??? }
5.遞歸邊界:k=1(只剩一個數就不用再交換了)
6.對于每個分支(如下圖)都已確定n個位置的數字,所以直接輸出排列:
if (k == 1) {
??????? for (int i = 0; i < n; ++i) {
??????????? printf("%d ",data[i] );
??????? }
??????? printf("\n");
??? }
完整代碼:
#include<stdio.h>
void printPermutations(int data[], int n, int k) {
??? if (k == 1) {
??????? for (int i = 0; i < n; ++i) {
??????????? printf("%d ", data[i]);
??????? }
??????? printf("\n");
??? }
??? for (int i = 0; i < k; ++i) {
??????? int tmp = data[i];
??????? data[i] = data[k - 1];
??????? data[k - 1] = tmp;
??????? printPermutations(data, n, k - 1);
??????? tmp = data[i];
??????? data[i] = data[k - 1];
??????? data[k - 1] = tmp;
??? }
}
int main() {
??? int a[4] = { 1, 2, 3, 4 }; printPermutations(a, 4, 4);
??? return 0;
}
總結
- 上一篇: php实用吗,php实用小窍门
- 下一篇: 微信小程序接入阿里云直播