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种状态分别为:

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

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

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

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

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

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

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

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

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

继续递归即可。

 #include <iostream>
#include <cstdio>
using namespace std; void permutation(int k, int n, int a[])
{
//递归到底层
if(k == n-)
{
for(int i = ; i < n; i ++)
printf("%d", a[i]);
printf("\n");
}
else
{
for(int i = k; i < n; i ++)
{
int temp = a[k];
a[k] = a[i];
a[i] = temp; //交换后递归下一层
permutation(k+, n, a); //保证每一层递归后保持上一层的顺序
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
int main()
{
int a[];
int n;
scanf("%d", &n); for(int i = ; i < n; i ++)
a[i] = i+; permutation(, n, a);
return ;
}

不过输出的格式有点偏差


全排列 递归方法(permutation原理的更多相关文章

  1. [算法]——全排列(Permutation)以及next_permutation

    排列(Arrangement),简单讲是从N个不同元素中取出M个,按照一定顺序排成一列,通常用A(M,N)表示.当M=N时,称为全排列(Permutation).从数学角度讲,全排列的个数A(N,N) ...

  2. 字符串全排列(permutation)

    Reference: http://www.cnblogs.com/sujz/archive/2011/06/16/2082831.html 问题:给定字符串S,生成该字符串的全排列. 方法1:依次从 ...

  3. [Swift]LeetCode266.回文全排列 $ Palindrome Permutation

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  4. [LeetCode] “全排列”问题系列(二) - 基于全排列本身的问题,例题: Next Permutation , Permutation Sequence

    一.开篇 既上一篇<交换法生成全排列及其应用> 后,这里讲的是基于全排列 (Permutation)本身的一些问题,包括:求下一个全排列(Next Permutation):求指定位置的全 ...

  5. 非递归全排列 python实现

    python algorithm 全排列(Permutation) 排列(英语:Permutation)是将相异物件或符号根据确定的顺序重排.每个顺序都称作一个排列.例如,从一到六的数字有720种排列 ...

  6. python非递归全排列

    刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...

  7. Pythono 实现 Permutation

    不管在R 还是python中,都有现成的函数来轻而易举地进行全排列(Permutation).无序排列等等.今天想要尝试一下使用自己写代码来实现全排列. 首先,我采用的算法如下: 对于一个数列 i.e ...

  8. 剑指Offer26 字符串的全排列

    /************************************************************************* > File Name: 26_String ...

  9. 算法题丨Next Permutation

    描述 Implement next permutation, which rearranges numbers into the lexicographically next greater perm ...

随机推荐

  1. Flutter布局--appbar导航栏和状态栏

    MaterialApp 先看下上图的具体用法:1. title:标题2. actions:表示右侧的按钮的动作3. leading:表示左侧的按钮的动作4. flexibleSpace:5. back ...

  2. Django_03_模板的使用

    {{ }} 变量 list类型用 'lst.索引',且不支持倒序索引,即不能识别lst.-1 dic类型用 'dic.key',去取对应的value,不支持{} 对于实例对象,通常自己重写__str_ ...

  3. C#使用KingAOP实现AOP面向切面编程一

    AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 实现AOP主要由两种方式,一种是编译时静态植入,优点是 ...

  4. Java面试 - == 和 equals 的区别?

    ==:如果比较的对象是基本数据类型,则比较的是数值是否一致:如果比较的是引用数据类型,则比较的是对象的地址值是否一致. equals():equals()方法不能用于比较基本数据类型的对象,如果对象和 ...

  5. 剑指offer51:构建乘积数组B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1],不能使用除法

    1 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] ...

  6. python学习-27 匿名函数

    匿名函数 1. 语法:   lanbda x:x+1 def a(x): return x+1 res = a(10) print(res) 运行结果: 11 Process finished wit ...

  7. 写CSDN博客

    文章目录 前言 写博客的规范 写博客的小技巧 版权声明模板 博客表格模板 更改博客字体和颜色 LaTeX 数学公式 前言 这是一篇关于写CSDN博客的文章.记录我的博客规范,技巧,模板,心得. 写博客 ...

  8. PAT(B) 1005 继续(3n+1)猜想(Java)

    题目链接:1005 继续(3n+1)猜想 分析  找出所有的被"覆盖"的数,然后再将输入的数中不在被"覆盖"的数中的数添加到"关健数"中.输 ...

  9. Yii2 基于header 实现接口版本控制

    Yii2 官方给出的方案是基于url的版本控制,但是我们的versoin放在header里面,需要通过header来进行版本控制,实现如下: 首先在基类中实现actions,actions是针对con ...

  10. 修改feign解析器替换json

    @Bean public Logger.Level getFeignLoggerLevel() { return Logger.Level.FULL ; } @Bean public Response ...