数据结构考研大题----递归实现全排列
程序员文章站
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;
}
上一篇: 使用kubespary安装k8s集群
下一篇: 线性表代码总结