| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2528 人关注过本帖
标题:[求助]试设计一个递归算法,产生n!个不同的全排列
只看楼主 加入收藏
shohokuooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:93
专家分:0
注 册:2005-1-29
收藏
 问题点数:0 回复次数:10 
[求助]试设计一个递归算法,产生n!个不同的全排列
如题:设计一个递归算法,产生n!个不同的全排列
(注意:是n!个不同的全排列,不是求n!的数值)
不要求写出原代码用类C写写算法就可以,我只想知道算法,谢谢大家!
有能力的帮帮在下,不胜感谢!
搜索更多相关主题的帖子: 递归算法 排列 设计 数值 
2007-10-11 08:43
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
stl:

next_permutation

Fight  to win  or  die...
2007-10-11 10:09
shohokuooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:93
专家分:0
注 册:2005-1-29
收藏
得分:0 
?
斑竹的答案?

2007-10-11 10:21
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
没仔细看,我以为在c++版呢,我说的是c++的库函数。

递归也是可以的:

EX:
123

保留1,23做排列{2,3}{3,2}再并上1
保留2,13做排列{1,3]{3,1}再并上2
……

这就是递归思想

Fight  to win  or  die...
2007-10-11 10:47
shohokuooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:93
专家分:0
注 册:2005-1-29
收藏
得分:0 

斑竹的说法我怎么觉得像循环呢?
以下是我从网上找的算法,不过不是太懂.
#include <stdio.h>
void permutation(char a[], int m, int n)
{
int i;
char t;
if (m<n-1) {
permutation(a, m+1, n);
for (i=m+1;i<n;i++) {
t=a[m]; a[m]=a[i]; a[i]=t;
permutation(a, m+1, n);
t=a[m]; a[m]=a[i]; a[i]=t;
}
} else
{
printf("%s ", a);
}
}
int main() {
char a[]="ABCDE";
permutation(a, 0,5);
return 0;
}


2007-10-11 21:50
shohokuooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:93
专家分:0
注 册:2005-1-29
收藏
得分:0 
还有一个简单点的:
void genPermutation(int k, int n, int* perm) {
if (k >= n) {
for (int i = 0; i < n; ++i) {
cout << perm[i] << " ";
}
cout << endl;
}
for (int i = k; i < n; ++i) {
swap(perm[i], perm[k]);
genPermutation(k + 1, n, perm);
swap(perm[i], perm[k]);
}
}

2007-10-11 21:52
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
以下是引用shohokuooo在2007-10-11 21:52:52的发言:
还有一个简单点的:
void genPermutation(int k, int n, int* perm) {
if (k >= n) {
for (int i = 0; i < n; ++i) {
cout << perm[i] << " ";
}
cout << endl;
}
for (int i = k; i < n; ++i) {
swap(perm[i], perm[k]);
genPermutation(k + 1, n, perm);
swap(perm[i], perm[k]);
}
}

这个就是我说的递归。
swap(perm[i], perm[k]); //保留i,交换的作用因为每个数唯一不重复
genPermutation(k + 1, n, perm); //递归,就是把保留i以后的参加递归
swap(perm[i], perm[k]); //还原

EX:
1,2,3

先保留1,交换1,1 递归23
保留2,交换2,2,递归3
保留3,交换3,3,输出;
然后一步步返回。


Fight  to win  or  die...
2007-10-11 22:49
codelet
Rank: 2
来 自:广东深圳
等 级:论坛游民
帖 子:61
专家分:37
注 册:2007-11-6
收藏
得分:0 
自己写个“1,2,3”来模拟一下就好理解了。

genPermutation(k , n, perm)是把数组分成两部分perm[0...k]和perm[k+1...n];
然后对前一部分perm[0...k]进行排列,再接上后面的perm[k+1...n]就组成一个输出结果。

这里是一直递归到k = n 才返回,也即生成perm[0]到perm[n]的全排列。
genPermutation(k+1, n, perm) //这个是递归主体,k不停加一,直到等于n。

Losing emotion, Finding devotion.
2007-11-19 11:18
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

倚天照海花无数,流水高山心自知。
2007-11-19 15:31
feibiaili
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2007-11-17
收藏
得分:0 
应该没必要用递归,多麻烦啊!
2007-11-22 19:24
快速回复:[求助]试设计一个递归算法,产生n!个不同的全排列
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023924 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved