|
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
郁闷 没人来给我加分!
, ]: P3 B- o* [6 J3 \1 }) ^假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:3 f D" q- j* v. v
{1,2,3}=1{2,3},2{1,3},3{1,2} 也就是说求1,2,3有全排列由三个部分组成了分别为1{2,3},2{1,3},3{1,2},大括号前面的称为前缀。一直递归下去就可求出结果。所以假设perm(int list[],int begin,int end)表示输出前缀为"list[0,begin]"后缀为"list[begin+1,end]的全排列"。
5 \ ?: d/ k8 Y, |( G8 \$ N+ g 令int list={1,2,3},所以:
/ Q/ p- c8 H5 s8 b! d- X/ j4 k perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};
- k, f0 ?/ R7 S; x1 ^
' K6 Q7 Z% G. l; K& S
; r, }2 \3 R" R/ r. J* p* S" ? 理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>7 g& Z/ A7 [. _! B7 S) O
typedef int ElemType;2 F- ~( T2 F+ i( A! |% `+ b
3 C% B* z3 }4 J& k+ P2 {void swap(ElemType *a,ElemType *b){( y6 u, ?( M8 ~' ~# [' O( l u+ y
//交换2个数
* r2 f% Y% A6 u9 j6 t) g ElemType temp=*a;8 j% t* L D2 l+ s5 F% [
*a=*b;
& ^4 ^. i9 V' f4 o1 t2 `' ]( F- z *b=temp;
; u3 ^4 b+ m* W! M* R& d}//swap6 |# w: Y, X: Z1 _
6 O0 X6 g$ h2 P- }void perm(ElemType list[],int begin,int end){9 ^# Q3 V6 v9 O( w" m& T, e
int i=0;
6 ?! V) R0 s) V if(begin==end){ m$ U3 ~9 d# R
for(i=0;i<=begin;i++)
4 V3 H7 N+ P" r( Z printf("%d ",list);- I& m% J4 c* ^1 j
printf("\n");. I" a6 b% } o8 v
}7 T1 d! S* l4 r1 \1 b' h
else! c: Z7 h5 p" {
for(i=begin;i<=end;i++){ Y9 a! r- {; u+ y" Q: Q% y* R2 R/ ?
swap(&list,&list[begin]);: X9 S" Z) w$ H' S1 B4 ? y
perm(list,begin+1,end);' @1 ]$ e& Z& _' ~( J/ H) r
swap(&list,&list[begin]);
2 u5 m: X) ~$ ?% W4 { }! S" Z, y3 r# d: ^; _
}//perm
7 L# R8 h( }* C3 W. v; \
9 k1 H' a( D! |8 nvoid main(){- y+ H- n1 W5 q3 k4 \; ^
ElemType list[]={1,2,3};& t; Z3 f1 H2 {# @; \ F: W( b) }
perm(list,0,2);
* f; j4 F2 o, X+ n4 I; a}
|+ v8 z9 c$ m7 n* u" O6 V- u/ s
, r4 g$ v' M+ z! I8 i! m
7 X1 x3 H$ I' R; _9 iC++代码 #include <iostream>+ ~$ o& J+ Z& b1 F& w; m
; l# H9 h: s Ftemplate <class _Ty>
% \ w- e1 i* }/ c9 Mvoid perm(_Ty list[],int begin,int end){
. K, N$ r0 e E" ]% t* ] //输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;! _9 w" l$ c- U& W
//前缀是固定的,求后缀的时候要用递归求* d- I# L! P6 K' i2 m x: M
- O1 y5 ^6 A* V- }/ R7 i
if(begin==end){3 ~% E. d) b. }/ |
//如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀
) p, G f2 p N, O3 W, T1 ^! _% ~$ @
1 ]; R! u4 P. K- y, Ifor(int i=0;i<=begin;i++)
% J0 u9 \4 h' C, ^3 x- c2 k std::cout<<list;
3 l6 M5 V: R0 A% C std::cout<<std::endl;//输出一个之后,换行* i: Q4 B" u$ `, h) R3 k- F
}
d1 T3 ^/ Z5 q9 L5 Z else{, Q8 R& H9 N: a; `: m N) V: F
//如果不相等,就要循环(end-begin)次,每次前缀都不同; n# _9 l% t% H. s9 x# L
0 O! V7 b! j$ \! X2 g) {; C! T2 {
for(int i=begin;i<=end;i++){
9 T) D# f% n, ]% g; B std::swap(list,list[begin]);//交换之后就可以得到前缀了9 K6 S, h& \. B" n1 Z: }4 {
perm(list,begin+1,end);//递归输出
1 k1 l$ B- T( l7 O std::swap(list,list[begin]);//换回来6 v9 h8 M, }( r7 d3 _
}6 A0 ]4 |' K& m5 a' v
}. @- g5 q; ], N
}
' }. l: P; y" Y+ i" p: ?, {% v1 y- V
+ z. k. n6 T) t+ {" d7 K1 ~% g& svoid main(){
$ A' f6 ~8 y! `0 b3 D' _# f- M int list[]={1,2,3}; _( v5 ^+ {* T8 u. P) a
perm(list,0,2);
t m& m6 h9 W1 `; K}
1 }/ ]' k, d# w* ~& d! Q
" {6 t$ P# }6 @2 Z; [/ S F+ Q+ H+ o J6 C9 y R( N# g
C#源码 using System;+ I7 h. C9 z* b! ]4 r/ d
using System.Collections.Generic;
! K1 | x$ ^ Q, p2 `
' o: P0 v8 U. ]3 @9 K7 V# enamespace CSharpDemo0 m; m* | E9 |/ p9 H3 e8 ~% l
{
+ r+ s3 x& P' s* Q/ X+ q4 x class Program) I, M* c; s- w* @$ ^% [7 v/ y
{
' j( |( y1 U# @4 {6 @ public
2 y% [5 R5 Y; ~% i( S, cstatic- v4 L' S* O. r6 n# E6 E8 Y
void Swap<T>(ref T a, ref T b)4 B2 x& M9 ]2 T
{
8 `8 V' U3 y" M( A" ]; B3 ]; | T temp = a;
4 \0 v, @6 }+ a+ _ a = b;5 h# c W* J6 e5 M& \ Z
b = a;
. }$ k8 X1 W- b* r }
* s- m8 P2 C2 N5 ^2 i2 F
* M% F% X( P! _, T8 X* ] public) V$ ]4 Y6 W$ ]: a
static# t8 k* Y0 B/ v" I z: n
void Perm<T>(T[] list, int begin, int end)
6 J; Q' ~- ^9 O {2 \' z% q+ v5 n
if (begin == end)/ D5 [; h: I( R$ W3 ?5 `
{
, Z. X: ~/ `! ?% d! _ for (int i =0 R. C7 K/ P! a Z8 c( Y( A, a
0; i <= begin; i++)2 z4 Q) v5 F& d' `
Console.Write(list);3 R; Z8 e8 D( \0 M
Console.WriteLine();- k7 _! l" u: {9 O
}
# O" o) i" G( L1 I, Z, \; f7 @7 c$ z else8 J& { Y- A9 Z/ z- m2 O
for (int i = begin; i <= end; i++)) y: {) w* |. y# o) V/ G& |" T/ ]6 D2 X
{
2 A" j% Q) r% d Swap<T>(ref list, ref list[begin]);+ K' B( S1 t0 z% N
Perm<T>(list, begin+1, end);
( d; N5 [4 p0 b( Y' W Swap<T>(ref list, ref list[begin]);
& m) a. m+ L6 T. c }
* J5 s* {; g& Y6 k6 F, u6 f B }
7 P+ h1 R1 W# I- } n3 f9 f4 M" w. B0 M9 S+ B& t+ D
static1 d! S$ l; E5 x" [9 I; ^" d) ^
void Main(string[] args)1 U- P1 _8 I$ @
{
- K! ]; L0 U8 B# w4 l: v* Q int[] list ={ 1, 2, 3 };; F/ c8 o( {* |8 U U1 @
Perm<int>(list, 0, 2);8 c8 J: v7 W4 M2 Y
}
3 F* v, u8 J8 t3 }# H }+ V- _- Z9 u8 N, G( u: S5 ?
}, O: j7 R* R9 M2 f w+ w7 l
|