用递归求解全排列问题(个人理解)
2016-10-07 00:00
211 查看
//求1~n的全排列
#include<stdio.h>
void show(int a[],int n){
int i;
for(i = 0;i<n;i++){
printf("%d",a[i]);
}
printf("\n");
}
void perm(int a[],int n,int k){
if(k==n){
//排完了一个排列调用show()方法显示
show(a,n);
}
else{
for(int i=1;i<=n;i++){
bool has = false; //作为 i 是否已在 a 中的标记
for(int j=0;j<k;j++){
//循环判断 i 是否在 a 中
if(a[j]==i){
//若 i 在 a 中,则将标记置为 true
has = true;
}
}
if(!has){
//将i填入当前位置
a[k] = i;
//填下一位置的数
perm(a,n,k+1);
}
/*
若i<=n则循环会继续
如果条件符合
则重新设置a[k]后。继续调用 perm(a,n,k+1);
*/
}
}
}
int main(){
int a[10];
int n;
printf("输入n: ");
scanf("%d",&n);
printf("1~%d的全排列如下:\n",n);
perm(a,n,0);
return 0;
}
#include<stdio.h>
void show(int a[],int n){
int i;
for(i = 0;i<n;i++){
printf("%d",a[i]);
}
printf("\n");
}
void perm(int a[],int n,int k){
if(k==n){
//排完了一个排列调用show()方法显示
show(a,n);
}
else{
for(int i=1;i<=n;i++){
bool has = false; //作为 i 是否已在 a 中的标记
for(int j=0;j<k;j++){
//循环判断 i 是否在 a 中
if(a[j]==i){
//若 i 在 a 中,则将标记置为 true
has = true;
}
}
if(!has){
//将i填入当前位置
a[k] = i;
//填下一位置的数
perm(a,n,k+1);
}
/*
若i<=n则循环会继续
如果条件符合
则重新设置a[k]后。继续调用 perm(a,n,k+1);
*/
}
}
}
int main(){
int a[10];
int n;
printf("输入n: ");
scanf("%d",&n);
printf("1~%d的全排列如下:\n",n);
perm(a,n,0);
return 0;
}
相关文章推荐
- 全排列问题之递归求解
- 递归求解字符数组全排列问题
- 全排列问题之递归求解
- 全排列问题之递归求解
- 由erlang的递归理解数组的全排列问题
- 关于SQL SERVER 公用表达式CTE应用递归时的模型个人的理解
- 在MSF中怎么区分易混淆的工作项类型:Bug、风险和问题(我个人的理解)
- Java中线程安全问题个人理解
- 对于递归的个人理解(1)
- 关于n皇后问题的递归求解,有详细的步骤说明。
- 数据结构与算法中的“递归”——用回溯法求解8皇后问题
- 利用递归来求解迷宫问题
- 八皇后递归求解问题
- 用递归方法求解汉诺塔问题
- 递归求解汉诺塔问题
- 迷宫问题的递归求解
- 递归问题求解学习一
- 8皇后问题递归求解
- 深度优先—递归方法 求解n皇后问题
- 递归程序求解问题的通用法则