zoukankan      html  css  js  c++  java
  • 全排列 递归方法(permutation原理

    https://blog.csdn.net/axiqia/article/details/50967863  原博客

    (一)递归的全排列算法

    (A、B、C、D)的全排列为

    1、A后面跟(B、C、D)的全排列

    2、B后面跟(A、C、D)的全排列(A与B交换,其他次序保持不变

    3、C后面跟(B、A、D)的全排列(A与C交换,其他次序保持不变)

    4、D后面跟(B、C、A)的全排列(A与D交换,其他次序保持不变)

    用数字举例方便点:

    1234
    1243
    1324
    1342
    1432
    1423
    2134
    ....
    3214
    3214
    3241
    3124
    3142
    3412
    3421
    4231

    为观察规律,仅仅标红1234全排列中最高位首次1,2,3,4的排列。

     

    解释:

    以1234为基础(代码中第二次交换的意义),同为第一层递归的4种状态分别为:

    第一位和第一位交换(1234==》1234);

    第一位和第二位交换(1234==》2134);

    第一位和第三位交换(1234==》3214);

    第一位和第四位交换(1234==》4123)。

     

    为保证普遍性,选第三种状态继续递归:

    以3214为基础,同为第二层递归的三种状态分别为:

    第二位和第二位交换(3214==》3214);

    第二位和第三位交换(3214==》3124);

    第二位和第四位交换(3214==》3412)。

     

    继续递归即可。

     

     1 #include <iostream>
     2 #include <cstdio>
     3 using namespace std;
     4  
     5 void permutation(int k, int n, int a[])
     6 {
     7     //递归到底层
     8     if(k == n-1)
     9     {
    10         for(int i = 0; i < n; i ++)
    11             printf("%d", a[i]);
    12         printf("
    ");
    13     }
    14     else
    15     {
    16         for(int i = k; i < n; i ++)
    17         {
    18             int temp = a[k];
    19             a[k] = a[i];
    20             a[i] = temp;
    21  
    22             //交换后递归下一层
    23             permutation(k+1, n, a);
    24  
    25             //保证每一层递归后保持上一层的顺序
    26             temp = a[k];
    27             a[k] = a[i];
    28             a[i] = temp;
    29         }
    30     }
    31 }
    32 int main()
    33 {
    34     int a[100];
    35     int n;
    36     scanf("%d", &n);
    37  
    38     for(int i = 0; i < n; i ++)
    39         a[i] = i+1;
    40  
    41     permutation(0, n, a);
    42     return 0;
    43 }

     不过输出的格式有点偏差

    12345
    12354
    12435
    12453
    12543
    12534
    13245
    13254
    13425
    13452
    13542
    13524
    14325
    14352
    14235
    14253
    14523
    14532
    15342
    15324
    15432
    15423
    15243
    15234
    21345
    21354
    21435
    21453
    21543
    21534
    23145
    23154
    23415
    23451
    23541
    23514
    24315
    24351
    24135
    24153
    24513
    24531
    25341
    25314
    25431
    25413
    25143
    25134
    32145
    32154
    32415
    32451
    32541
    32514
    31245
    31254
    31425
    31452
    31542
    31524
    34125
    34152
    34215
    34251
    34521
    34512
    35142
    35124
    35412
    35421
    35241
    35214
    42315
    42351
    42135
    42153
    42513
    42531
    43215
    43251
    43125
    43152
    43512
    43521
    41325
    41352
    41235
    41253
    41523
    41532
    45312
    45321
    45132
    45123
    45213
    45231
    52341
    52314
    52431
    52413
    52143
    52134
    53241
    53214
    53421
    53412
    53142
    53124
    54321
    54312
    54231
    54213
    54123
    54132
    51342
    51324
    51432
    51423
    51243
    51234
  • 相关阅读:
    .NET Core 服务调用 RPC
    从Docker 到 Kubernatetes 的跃迁之路
    同步异步-多线程梳理
    Net的微服务选型之路
    Visual Studio 2019安装SSIS
    HL7协议的基本语法
    vue学习笔记
    开发常用的部分sql语句总结
    VSPD虚拟串口来调试通信接口程序
    SSRS报表工具之合并行数据
  • 原文地址:https://www.cnblogs.com/thunder-110/p/9287161.html
Copyright © 2011-2022 走看看