1. 程式人生 > 其它 >CMake 編譯 C + Assembly

CMake 編譯 C + Assembly

  • 用遞迴交換的思想
    • 假設要求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;
        }
    }