全排列 递归方法(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种状态分别为:
第一位和第一位交换(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原理的更多相关文章
- [算法]——全排列(Permutation)以及next_permutation
排列(Arrangement),简单讲是从N个不同元素中取出M个,按照一定顺序排成一列,通常用A(M,N)表示.当M=N时,称为全排列(Permutation).从数学角度讲,全排列的个数A(N,N) ...
- 字符串全排列(permutation)
Reference: http://www.cnblogs.com/sujz/archive/2011/06/16/2082831.html 问题:给定字符串S,生成该字符串的全排列. 方法1:依次从 ...
- [Swift]LeetCode266.回文全排列 $ Palindrome Permutation
Given a string, determine if a permutation of the string could form a palindrome. For example," ...
- [LeetCode] “全排列”问题系列(二) - 基于全排列本身的问题,例题: Next Permutation , Permutation Sequence
一.开篇 既上一篇<交换法生成全排列及其应用> 后,这里讲的是基于全排列 (Permutation)本身的一些问题,包括:求下一个全排列(Next Permutation):求指定位置的全 ...
- 非递归全排列 python实现
python algorithm 全排列(Permutation) 排列(英语:Permutation)是将相异物件或符号根据确定的顺序重排.每个顺序都称作一个排列.例如,从一到六的数字有720种排列 ...
- python非递归全排列
刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...
- Pythono 实现 Permutation
不管在R 还是python中,都有现成的函数来轻而易举地进行全排列(Permutation).无序排列等等.今天想要尝试一下使用自己写代码来实现全排列. 首先,我采用的算法如下: 对于一个数列 i.e ...
- 剑指Offer26 字符串的全排列
/************************************************************************* > File Name: 26_String ...
- 算法题丨Next Permutation
描述 Implement next permutation, which rearranges numbers into the lexicographically next greater perm ...
随机推荐
- 月光大盗(moon thief)
欢迎大家玩月光大盗! welcome to play moon thief!developer email:zhangdeke@126.com
- 最新 东方财富java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.东方财富等10家互联网公司的校招Offer,因为某些自身原因最终选择了东方财富.6.7月主要是做系统复习.项目复盘.Leet ...
- js删除array数组中元素
for(var i = 0; i < array.length; i++) { if(-1 != array[i]) { array.splice(i, 1); i--; } } 上面if就是判 ...
- Windows Terminal Preview v0.7 Release
Windows Terminal Preview v0.7 Release The following key bindings are included by default within this ...
- PAT(B) 1005 继续(3n+1)猜想(Java)
题目链接:1005 继续(3n+1)猜想 分析 找出所有的被"覆盖"的数,然后再将输入的数中不在被"覆盖"的数中的数添加到"关健数"中.输 ...
- go for range 可以方便的对slice 切片或者 map 进行迭代循环
package main import ( "fmt" "math/rand" "time" ) func main ...
- gin mongodb restful api设计: 动态的patch接口
目录 什么是Patch? Patch方法可以用来更新资源的一个组成部分 什么时候使用Patch? 当你仅需更新资源的某一项,即不完全也不幂等 那当我们的模型在数据库中几乎每个字段都可能会遇到改变的时候 ...
- Python使用datetime来判断近七天
目录 strptime 使用strptime来格式化字符串 datetime.datetime.strptime("2019-10-02", "%Y-%m-%d" ...
- Yii2 设计模式——单例模式
单例模式 模式定义 单例模式确保一个类只有一个实例,并提供一个全局访问点.当现实中只需要一个对象,或者为了节省系统资源,又或者是为了共享数据的时候可以使用单例模式. 代码实现 我们先来看看单例模式的标 ...
- C# LoadXml System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.
去掉BOM头 writer = new XmlTextWriter(stream, new UnicodeEncoding(false,false)); 如果是UTF8 writer = new Xm ...