递归实现全排列(一)

【思路】

下面用具体例子来阐述这种实现的思路,例如实现123的全排列组合。

要求123的全排列,可以分为以下情况:

情况1:第0位为1+23的全排列

情况2:第0位为2+13的全排列

情况3:第0位为3+32的全排列

上面的情况用代码实现如下:

//情况1
//为了跟下面一致,加上swap(list[0],list[0]);
perm(list,1,2);
//为了跟下面一致,加上swap(list[0],list[0]);

//情况2
swap(list[0],list[1]);
perm(list,1,2);
swap(list[0],list[1]);

//情况3
swap(list[0],list[2]);
perm(list,1,2);
swap(list[0],list[2]);

这3种情况可以用循坏代替:

for(int i=0;i<=2;i++)
{
  swap(list[0],list[i]);
  perm(list,1,2);
  swap(list[0],list[i]);
}

【全排列实现代码一】

#include<iostream>
using namespace std;
void perm(char list[],int k,int m);
void perm(char list[],int k,int m)
{
    if(k==m)
    {
       for(int j=0;j<=m;j++)
       {
        cout<<list[j];
       }
       cout<<endl;
    }
    else
    {
     for(int i=k;i<=m;i++)
     {
      std::swap(list[k],list[i]);
      perm(list,k+1,m);
      std::swap(list[k],list[i]);
     }
    }
}
int main()
{
    char a[]="123";
    perm(a,0,2);
    system("pause");
    return 0;
}
时间: 2024-08-25 19:48:40

递归实现全排列(一)的相关文章

Java使用递归实现全排列的代码

将写内容过程经常用到的一些内容备份一下,下边内容是关于Java使用递归实现全排列的内容. public class AllPermutation { public static void main(String[] args) { char[] source=new char[]{'A','B','C'}; char[] result=new char[source.length]; allPermutation(0,source,result); } public static void al

递归之全排列问题

一.问题描述 如输入一个字符串abc,其中的元素都不一样,则根据数学知识很容易得知道它的全排列有n!=3!=6; 即abc;acb;bac;bca;cab;cba; 当然如果包含重复元素,如aab,实际的全排列是:aab;aba;baa三种,则需要剔除掉重复的情况. 这里我们就是研究如何准确无误的将其所有的排列进行统计以及显示等. 二.问题分析 对全排列问题而言,其过程可以理解为递归思想.如abc,我们先任意取一个元素如a,则对bc进行全排列,依次类推 直到最后只有一个元素全排列,即是它本身.

算法之使用递归求解全排列

在python中有一个模块叫做itertools,使用这个模块能够快速的求解排列组合问题,刚好朋友问到怎么求全排列问题,不能用内置模块去做,于是...自己想了想逻辑,使用递归实现比较简单. 下面是简单的实现代码: 1 #!/usr/bin/env python 2 # encoding:utf-8 3 # __author__: huxianglin 4 # date: 2016/9/25 12:09 5 # blog: http://huxianglin.cnblogs.com/ http:/

递归解决全排列生成算法

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 方法一: 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (2)出口:如

Java用递归实现全排列,详细

package edu.cqu.algorithmTest; import java.util.Scanner; // 全排列,递归实现 public class Main8 { public static void main(String[] args) { int[] arr = { 1, 2, 3}; bfs(arr, 0, arr.length - 1); } public static void bfs(int []a,int start,int end) { /* * 递归的终点是,

递归实现全排列python

python递归实现"abcd"字符串全排列 1.保持a不动,动bcd 2.保持b不动,动cd 3.保持c不动,动d def pailie(head="",string=""): if len(string)>1: for father_string in string: pailie(head+father_string,string.replace(father_string,"")) #关键一点:将头和尾全部传下去

递归解决全排列算法

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (2)出口:如果只有一个

递归实现全排列算法-161029

算法要点: n个元素的全排列:一个元素放在最前方,剩下n-1个元素的全排列 出口:当就剩下一个元素需要全排列的时候,把数组打印出来就行了 http://blog.csdn.net/xiazdong/article/details/7986015------------写的比黑皮书好致敬! 没想明白的地方:当一个元素需要全排列时,这时候打印数组,说明这个时候数组整个就已经被改变了. 所以在之前,应该做 把一个元素放在最前方, 在之后,把数组恢复成原来的样子 所以要用swap函数 perm(type

【递归】全排列

Description 输入一个数字n,输出从1~n组成的数字的全排列,每个排列占一行,输出按照数值升序排列 比如输入2,则输出是: 12 21 又如输入3,则输出是: 123 132 213 231 312 321 Input 第一行是一个整数m,代表有m个测试用例 接下来的m行,每行是一个整数n,0 < n < 10 Output 对于每个用例,输出它的全排列,每个排列占一行,输出按照数值升序排列 Sample Input Copy sample input to clipboard 2