[递归入门] 全排列

题目描述: 排列与组合是常用的数学方法。先给一个正整数 ( 1 < = n < = 10 ) 例如n=3,所有组合,并且按字典序输出: 
1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1 

分析:今天看书看到了递归入门,做到了这一道题目,记录一下。在C++的库函数中,提供了函数next_permutation(),来获得一个数组的各种组合,这个题目的第一种解法就是使用这个函数就可以很简单的完成。除此之外,这里中这道题目进行了简单的递归练习,就是用深度遍历算法来求出所有的排列组合。递归的做法是借助深度遍历算法,递归的边界是已经选择了n个数。

//way 1:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int a[15] ;

int main()
{
    for(int i=0;i<15;i++)
    {
        a[i]=i+1;
    }
    int n;
    scanf("%d",&n);
    do
    {
        for(int i=0;i<n;i++)
        {
            if(i>0){
                printf(" ");
            }
            printf("%d",a[i]);
        }
        printf("
");
    }while(next_permutation(a,a+n));
    return 0;
}
//DFS递归实现 
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> ans;
int a[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int flag[15]={0};
int n;

void DFS(int num)
{
    if(num==n)//已经选择了n个数则输出
    {
        for(int i=0;i<n;i++)
        {
            if(i>0)
            {
                printf(" ");
            }
            printf("%d",ans[i]);
        }
        printf("
");
        return ;
    }
    for(int i=0;i<n;i++)
    {
        if(flag[i]==0)
        {
            ans.push_back(a[i]);
            flag[i]=1;
            DFS(num+1);
       //退出递归后记得将刚刚插入的数弹出 flag[i]=0; ans.pop_back(); } } } int main() { scanf("%d",&n); DFS(0); return 0; }
原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6427767.html