欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构考研大题----递归实现全排列

程序员文章站 2022-07-13 21:10:29
...

题目描述:请你用递归实现n个数的全排列。

 

算法思想:

       首先定义三个数组,一个是存放输入数据的数组a;一个是用来存放排列后的数据的数组c;一个是用来标记此数据是否已存入c数组的数组b;

int a[];
int b[];
int c[];

        设置一个循环,从0-->n-1,在循环里依次将a[i]存入c[k](k为数组c的下标,与i可能相同,可能不同),每次存入时都将b[i]置为1,意为下标为i的节点已存入数组c。

       然后进入递归 ,函数名(a,k+1,n)----->每次递归k都要+1,保证a的数据依次存放在c里,而不会把c中原有的数据覆盖。在递归后面要将b[i]=0,因为要回溯。若不将b[i]=0,则只会输出一行数据,即初始数据。

      在循环前设置递归的退出条件 (k == n).在退出条件里就可以输出数组c,然后return;

void permutation(int *a,int k,int n)
{
    if(k == n )
    {
        for(int i=0;i<n;i++)
            std::cout<<c[i]<<" ";
        std::cout<<std::endl;
        return ;
    }
    for(int i=0;i<n;i++)
    {
        if(b[i]==0)
        {
            b[i]=1;
            c[k] = a[i];
            permutation(a,k+1,n);
            b[i]=0;
        }
    }
}

下面贴上10以内的全排列递归实现:

#include <iostream>

int b[10] = { 0 };
int c[10];
int a[10];

void permutation(int *a,int k,int n)
{
    if(k == n )
    {
        for(int i=0;i<n;i++)
            std::cout<<c[i]<<" ";
        std::cout<<std::endl;
        return ;
    }
    for(int i=0;i<n;i++)
    {
        if(b[i]==0)
        {
            b[i]=1;
            c[k] = a[i];
            permutation(a,k+1,n);
            b[i]=0;
        }
    }
}

int main()
{

    int n;
    std::cin>>n;
    for(int i=0;i<n;i++)
        std::cin>>a[i];
    std::cout<<std::endl;
    permutation(a,0,n);
    return 0;
}

 

相关标签: 考研 数据结构