数学建模社区-数学中国
标题:
算法:求全排列的递归算法
[打印本页]
作者:
知道了
时间:
2015-4-16 14:28
标题:
算法:求全排列的递归算法
; g8 N6 l- C. H* }
3 p/ E4 i& e- }3 c- c2 a
$ m4 ?/ h5 j9 o7 E
/*
( O; F. D+ {. Z* n$ p, I# @
使用递归方法求全排列
/ z" \; [1 R( r$ c/ M1 {
*/
y8 T, d3 Z# l) y5 U# o
& b! g* I# J8 x. O; P3 N5 Q
#include<stdio.h>
$ @2 g+ ]* _% R. U5 `
9 b( W# c5 z" B( E! b. G
int sum=0;
9 c, Y4 K# M D0 k, P q4 \5 w
int main(){
1 [; l0 S3 a" m9 X3 y; `2 R
int n,i;
' F9 p. \* K; L, r* G% @% j
char *p;
1 ^5 j# Y& J; y Z0 U3 K
void perm(char *,int,int);
" E; T9 T! c" Z/ N4 G
5 F2 z/ P B6 S2 f! E2 `
scanf("%d",&n);
" w: r" ]0 Z. b; m. P" O. o& N
p=new char[n];
. f$ K6 k& T- Z+ x) C
for(i=0;i<n;i++){
3 L9 P" P+ d6 K- q, M4 [& V. e
getchar();
- g3 j, H. U; q" h; J/ c0 z
scanf("%c",p+i);
+ c" l1 n% a4 |5 H9 E' H
}
( u- B( S1 g; @$ d+ {: W
$ g' e" y% K* R% m7 I) V
perm(p,0,n-1);
( d) E; [$ \+ b
printf("==>%d",sum);
j* F( t$ G' c9 C/ c5 k* ^' B
" o& `1 n0 }- n7 O
return 0;
+ L) i5 j# \" b! g) U# `
}
0 o4 v7 Q3 p7 ~' r
# Z- ~& W: p+ s$ D
void perm(char *p,int s,int e){
5 {3 e6 {- R, E' i4 G1 j/ ?5 f
int i;
1 p* a( [8 Q/ \( M6 u7 o
void swap(char*,char*);
* X9 j5 d0 V5 f1 S3 d% M% {
4 f( Q$ ~, I& r' u) }7 d
if(s==e){
* U1 q, n; E2 k0 ^* y; I
printf("%s\n",p);
9 `& N" @8 t7 C- f
sum++;
6 I/ C% J! b2 k2 I2 ]$ R2 P% v% s
return ;
! j' [0 d2 [" c7 H$ @
}
3 R/ }0 C! i& _: q: q
else{
* n: ?3 }2 s9 y1 g7 q
for(i=s;i<=e;i++){
9 R! p8 ^% z; ^
swap(p+s,p+i);
' {; ~8 j% a! Q0 k' X: A* s
perm(p,s+1,e);
9 i5 f4 ?! A* f: R: d) p! C5 c
swap(p+s,p+i);
& k0 w/ t! V: b2 \3 t$ ^
}
7 H/ L* U) n& Z2 ?
}
; ], R" Y8 J) r5 T
}
/ i2 i+ D7 E* S1 w0 j2 h: R- q
4 | n1 x; l1 {. ?/ T1 z
void swap(char *a,char *b){
6 F& Y4 Y( U( ~; _0 z5 N6 B0 W
int tmp=*a;
: d5 |' d9 n: Q% n5 C
*a=*b;
( D; B! V( f) \- l
*b=tmp;
5 e& Y: T' O# y0 ?
}
9 ~( K# L6 O1 W, ^7 h4 w
" B4 k" _9 ~5 F' o9 l6 k
======================================================================
3 g) @! ]# R; O8 s+ g4 V# X
1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
/ M/ [8 M' Q% R
2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
4 i! Z) }1 M7 W, V6 v
( q9 i$ i9 L$ V4 e% z
7 V0 B$ }9 z# R a0 R! Q
* ^# l; D- }- ~8 {7 w6 n: x
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5