CMake 編譯 C + Assembly
阿新 • • 發佈:2022-03-16
- 用遞迴交換的思想
- 假設要求1234的全排列。
- 首先把每個位置與最後一個交換,得到四種情況4231 1432 1243 1234;
- 最後一個位置的所有情況都找出來了,我們可以固定最後一個位置,對這四種情況的前三個進行同樣的操作,
- 比如 4231, 讓第三個位置每個數字坐一次,有 3241 4321 4231;
- 然後固定後面兩個位置,對前面的數字重複操作;
- 容易發現第一次有 4 種情況,第二次有 3 種情況,第三次有 2 種情況,第四次就只有 1 種情況了, 總的情況總類就是 4×3×2×1 = 24種,為4個數全排列的所有情況;
- 大致流程圖可以看成對樹的遍歷:
- 程式碼:
void perm(char a[],int n) { //全排列 for (int i = 0; i < n; ++i){ if (n==1){ //當n==1時, for(int i = 0; a[i]; ++i) printf("%c", a[i]); printf("\n"); return; } int temp = a[i]; a[i] = a[n-1]; a[n-1] = temp; perm(a, n-1); // 復原位置 temp = a[i]; a[i] = a[n-1]; a[n-1] = temp; } }