C++递归方法实现全排列

#include<iostream>
using namespace std;
void perm(int list[],int k,int m);//声明
void perm(int 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++)
     {
      swap(list[k],list[i]);//第一层,先和自己换。1和1换,2和2换,3就相等然后输出了。输出后回来,2和3换。
      perm(list,k+1,m);
      swap(list[k],list[i]);//将前面换回的顺序再换回来,防止变顺序。
     }
    }
}

int main()
{
    //char a[7]="123456";
    int a[3]={0,1,2};
    perm(a,0,2);
    system("pause");
    return 0;
}

逻辑顺序:

第一层循环3次:

k=0,i=k=0,list[0]和list[0]交换。然后递归调用k+1=1,2

进入第二层,循环2次:

k=1,i=k=1,list[1]和list[1]交换,然后递归调用k+1=2,2

此时相等,输出结果,0,1,2(相当于没有循环或者循环1次)

然后回到第二层,循环第二层的第2次

k=1,i=k+1=2,list[1]和list[2]交换,然后递归调用k+1=2,2

此时相等,输出0,2,1

然后回到第一层,循环第一层的第2次,后面同次过程。

时间: 2024-10-11 22:23:39

C++递归方法实现全排列的相关文章

全排列 递归方法(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交换,其他次序保持不变) 用数字举例方便点: 1234124313241342143214232134....32

去重全排列的非递归方法,,按从小到大排序

#include<iostream> #include<algorithm> #include<cstring>#include<string.h> using namespace std; #include<assert.h> //反转区间 void Reverse(char* pBegin , char* pEnd) { while(pBegin < pEnd) swap(*pBegin++ , *pEnd--); } //下一个排列

46 Permutations(全排列Medium)

题目意思:全排列 思路:其实看这题目意思,是不太希望用递归的,不过还是用了递归,非递归的以后再搞吧 ps:vector这玩意不能随便返回,开始递归方法用vector,直接到500ms,换成void,到12ms 1 class Solution { 2 public: 3 vector<vector<int>> permute(vector<int>& nums) { 4 vector<vector<int> >ans; 5 permute

不会全排列算法(Javascript实现),我教你呀!

今天我很郁闷,在实验室凑合睡了一晚,准备白天大干一场,结果一整天就只做出了一道算法题.看来还是经验不足呀,同志仍需努力呀. 算法题目要求是这样的: Return the number of total permutations of the provided string that don't have repeated consecutive letters. Assume that all characters in the provided string are each unique.F

Permutations,全排列

问题描述:给定一个数组,数字中数字不重复,求所有全排列. 算法分析:可以用交换递归法,也可以用插入法. 递归法:例如,123,先把1和1交换,然后递归全排列2和3,然后再把1和1换回来.1和2交换,全排列1和3,再把1和2交换回来.1和3交换,全排列2和1,再把1和3交换回来. 1 //递归方法 2 public List<List<Integer>> permute2(int[] num) { 3 List<List<Integer>> result =

5972: 【递归入门】全排列

题目描述 排列与组合是常用的数学方法. 先给一个正整数 ( 1 < = n < = 10 ) 例如n=3,所有组合,并且按字典序输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 输入 输入一个整数n(  1<=n<=10) 输出 输出所有全排列 每个全排列一行,相邻两个数用空格隔开(最后一个数后面没有空格) 样例输入 3 样例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 这是对昨天学习<算法竞赛入门经典>的复

算法练习:排列组合之全排列

问题描述 输入一个不含相同数字的序列,输出所有可能的排列. 问题分析 与之前的"求解子集合"类似,使用递归方法:典型的在for循环内调用递归函数.不同的是,必须等到所有的数字均在集合里才能输出.为了记录每个数字的使用情况,还需一个辅助数组记录每个数字的使用情况.详见代码部分的FullPermutation函数. 扩展问题 如果数列中含有重复的数字,并且输出的结果不含重复组合,那么怎么处理?比如,输入{1,1,2},输出{1,1,2}, {1,2,2}, {2, 1, 1}.我们在挑选数

生成排列的递归方法

一  提议描述: 输入正整数n,按照字典序从小到大的顺序输出前n个数的所有排列. 二 思路分析: 对此问题用递归的思想解决:先输出所有以1开头的排列(递归调用),然后输出以2开头的排列(递归调用),接着以3开头的排列,„,最后才是以n开头的排列. 以1开头的排列的特点是:第一位是1,后面是按字典序的2-9的排列.所以在设计递归函数需要以下参数: (1)已经确定的“前缀”序列,以便输出: (2)需要进行全排列的元素集合,以便依次选做第一个元素. 这样,写出以下的伪代码: void print_pe

常见算法之全排列 全组合

全排列算法是一种比较常考的算法,他的做法也比较多样. 首先我们来看看最符合我们直观思考的,思路是这样的:假如没有重复元素时,传入一个数组A,并插入到另外一个数组B中,假如B中已经包含这个元素,则跳过,否则插入数组B.我们来看看具体代码: <span style="font-size:14px;">public static void permutation1(final String str, String buffer){ if (str.length() == buff