c语言递归练习题求解

luoluoluooo 2020-01-27 01:36:32
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序。
输入样例:
3
输出样例:
123
132
213
231
312
321

同样的题目我用系统带的sort降序函数跑就可以,自己写了个降序排列就不行。有人帮忙看看吗。
这是我自己打的代码。把那个Asort换成系统带的sort函数就成功了,自己写的sort跑不出来。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
void Asort(int k,int N);
void Out(int k,int N);
int n[9]={1,2,3,4,5,6,7,8,9};
int main(){
int N;
cin>>N;
Out(0,N);
return 0;
}
void Out(int k,int N){
int t;
if(k==N-1){
for(int i=0;i<N;i++){
printf("%d",n[i]);
}
cout<<"\n";
}else{
for(int i=k;i<N;i++){
t=n[k];n[k]=n[i];n[i]=t;
Out(k+1,N);
Asort(k+1,N);//换成sort(n+k+1,n+N);就可以了
}
}
}
void Asort(int k,int N){
int tem;
for(int i=k;i<N-1;i++){
for(int j=k;j<N-1-i;i++){
if(n[j]>n[j+1]){
tem=n[j];
n[j]=n[j+1];
n[j+1]=tem;
}
}
}
}
...全文
185 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoluoluooo 2020-02-01
  • 打赏
  • 举报
回复
刚刚创的论坛号,看到的比较晚,不好意思。
luoluoluooo 2020-02-01
  • 打赏
  • 举报
回复
谢谢! 已经成功跑起来了
qybao 2020-01-29
  • 打赏
  • 举报
回复
排序方法有错
main方法不用变
Out(k+1,N);
Asort(k+1,N);//换成sort(n+k+1,n+N);//这里还是从k+1开始排序

修改排序方法
void Asort(int k,int N){
int tem;
for(int i=0;i<N-k;i++){
for(int j=k;j<N-1-i;j++){
if(n[j]>n[j+1]){
tem=n[j];
n[j]=n[j+1];
n[j+1]=tem;
}
}
}
luoluoluooo 2020-01-29
  • 打赏
  • 举报
回复
我还是没想懂 太难了
luoluoluooo 2020-01-29
  • 打赏
  • 举报
回复
j写成i确实是错了,但是我改正后,程序并没有跑成功。还有,改成t=n[k];n[k]=n[i];n[i]=t,也是不成功的。
qybao 2020-01-28
  • 打赏
  • 举报
回复
你的Asort排序的第二重for循环错了
for(int j=k;j<N-1-i;i++){ //改成j++

另外,调用排序时应该是Asort(k,N); 这一步的意义是递归前t=n[k];n[k]=n[i];n[i]=t;这里打乱了顺序,递归结束后要恢复为原来的顺序
不用排序改成t=n[k];n[k]=n[i];n[i]=t;也可以,即
for(int i=k;i<N;i++){
t=n[k];n[k]=n[i];n[i]=t;
Out(k+1,N);
//Asort(k,N);//这样也可以
t=n[k];n[k]=n[i];n[i]=t; //这样也可以,目的是恢复递归前的数组原来的顺序
}

一星伴月 2020-01-28
  • 打赏
  • 举报
回复
dfs其实就是递归的一种特殊情况,就是记录一下状态
luoluoluooo 2020-01-27
  • 打赏
  • 举报
回复
我目前还不会DFS,只会写到递归...这是数据结构第二章的课后习题... 我是自学的,可能学习顺序有点乱
user_qym 2020-01-27
  • 打赏
  • 举报
回复
这就是全排列问题鸭,简单的dfs #include<iostream> #include<string> #include<cstring> using namespace std; int visit[101],n,g[101][101],start,e,path[101],t=0,a[10001]; void dfs(int cur) { int i; if(cur==n) { for(i=1;i<=n;i++) cout<<a[i]; cout<<endl; } else { for(i=1;i<=n;i++) if(!visit[i]) { visit[i]=true; a[cur+1]=i; dfs(cur+1); visit[i]=false; } } } int main() { cin>>n; dfs(0); return 0; }

33,323

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧