马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
郁闷 没人来给我加分!
( F/ T* y" u, g2 s- s1 @3 m9 V假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:
! o5 S5 H5 s% Z3 x# d; }% ~: F; N {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]的全排列"。7 ^1 f! o: c. s% R9 o' Z C( E
令int list={1,2,3},所以:9 t3 D' n ?+ Y, r
perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};
2 ~% P. O+ o/ |+ `6 F- P- Y
* P, L0 ?0 y% Q: n. N
& v9 B) L0 ~6 ^" d. E4 F* O2 i% L( z 理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>9 A) r6 [$ O7 |: I: i# w4 W7 ]8 t
typedef int ElemType;
( i2 x3 a& B: _: }- ?/ A/ R
* T0 Q# I1 F1 K1 g7 Wvoid swap(ElemType *a,ElemType *b){4 Q/ h; A' M# S- _7 u( d5 s3 N. z
//交换2个数* K7 G; Y9 r. A
ElemType temp=*a;
: {5 B) d/ J$ z" X, | *a=*b;0 z V; P, L6 V7 d( @9 b" Y- f
*b=temp;
. {. E/ e, C9 @5 p2 r}//swap+ |0 U$ S1 W! ~( W; H
# H, s3 N/ @1 Z& c
void perm(ElemType list[],int begin,int end){
, S1 O, N: c6 g3 T: e int i=0;/ k4 ~ d) S# [. X- w4 ?
if(begin==end){
4 `2 H) l5 W6 {6 T( q8 V for(i=0;i<=begin;i++)
+ C/ C4 O6 J/ q. |; r1 V/ y printf("%d ",list);, z* S: @8 R- J: j$ Q5 [2 o5 u) U
printf("\n");
* u9 B" e# M( U4 z- ? }
( F+ _" d* [/ O/ s/ @ else2 Z' f& K$ x8 L' C4 ]: i$ C- P
for(i=begin;i<=end;i++){
0 N( C0 S" _% ]3 o/ O( W swap(&list,&list[begin]);" E( |) a0 ?1 G( P+ s3 y
perm(list,begin+1,end);: u* X, `4 a2 T2 G _+ O1 K$ X
swap(&list,&list[begin]);
# C+ \6 S4 d4 z" r/ M }% v# Y3 I0 Q8 o7 `* e$ V6 d9 q% v
}//perm
6 f) m! H: A6 \/ E& y* l1 k9 Y3 C6 U. h5 q( A3 X
void main(){8 h( Q1 |: y% G2 Z" P2 B$ ^% c! c
ElemType list[]={1,2,3};! k6 m& z/ A2 e1 W8 F
perm(list,0,2);% q2 L. V* k2 H. _
} " ?- z$ U# m' P5 ~6 t, h
7 Y) c: e* b! H- E
' _ j$ @: e4 L, K3 W5 C8 j
; a* s% E# d5 b' |/ ?6 YC++代码 #include <iostream>& R5 x7 b( x6 c) c
5 y0 F8 |/ @) j |, g: o
template <class _Ty>( w$ C/ H! e1 W4 F9 }% K
void perm(_Ty list[],int begin,int end){
3 l% D+ W3 k) L! | //输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;
( G- l) M5 t; t7 [6 O$ C5 A //前缀是固定的,求后缀的时候要用递归求
; V, I" P/ M1 G% A$ b7 m5 \. q' F h7 \: }
if(begin==end){. `( |, |- Y) C* T+ Q3 x
//如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀2 D1 m' Z6 h [6 F. V
7 }9 S6 I& T/ I3 c" P, Sfor(int i=0;i<=begin;i++)
( Q1 z' s8 r2 i! p# k. Q t3 Z std::cout<<list;
/ f( o. U& L4 O) L$ I, P std::cout<<std::endl;//输出一个之后,换行; C$ E2 W# w6 t+ w& W8 \% R
}
$ A6 w. w8 Q5 f" R2 Z' M2 V else{# q! ]5 a. l1 Z5 M8 G7 q+ C
//如果不相等,就要循环(end-begin)次,每次前缀都不同9 Y' H% w" `( b8 ?8 e9 V. X7 i
7 L' V! r, A7 q5 X9 r6 j8 hfor(int i=begin;i<=end;i++){
3 y7 ? b8 C; ^2 ~3 Y* G) ?! ~ std::swap(list,list[begin]);//交换之后就可以得到前缀了
+ w7 ^# w, c9 s$ H% L perm(list,begin+1,end);//递归输出" X+ g: g8 X/ ]& H( ~
std::swap(list,list[begin]);//换回来- O8 d# d2 k. d1 Y1 {, u
}
2 y3 ~0 O" b. u' F! Y+ H0 f }5 L ?: ?3 H' u( G; t
}
# f$ f( h0 Y7 v8 Q8 ~$ }* g4 i) J% {
void main(){) t0 I: B/ ? Q1 o( |8 k& P
int list[]={1,2,3};
; p, B# W9 S) `4 O0 Z) P/ M perm(list,0,2);
: v K4 u7 L X6 c! F. T/ m1 @}1 }3 v9 A, ^* _8 Z
}3 o/ \! v. U) ^: `, v, k" U& F; p# {0 `* a3 x* a
C#源码 using System;% ~! I4 t6 [; H9 S/ a, a
using System.Collections.Generic;
. f7 p% S- |' J- r$ e7 O! O0 c h' \
namespace CSharpDemo3 R' }" B( [ e" }
{# g2 _) t J- p9 H
class Program( o; i% m9 N h( \
{
4 K. ^" N0 F- Q6 s4 z public8 X, d: `# S: R% q7 a |0 T+ D( z8 ^
static
- p8 ^# E; A( R# G/ j8 q- cvoid Swap<T>(ref T a, ref T b)1 A$ ?7 Z# {$ s
{: ~. o# W1 d, {: t% o
T temp = a;
* N2 g r' @# f! c# y a = b;7 B4 n& A$ V3 D: m
b = a;
2 B7 M& `6 H9 {$ v) r }9 i1 L0 u1 g& ^) Q6 s) c% S8 ?
$ g. R" `$ [) s
public
4 j' ]2 R) ^+ [8 U( s1 b. |static3 ^+ Q3 r7 o1 G! E
void Perm<T>(T[] list, int begin, int end)( o1 t& J, G6 e/ b6 ^$ K8 m
{4 \) m8 d9 F) ~) u3 G3 n( q# Z
if (begin == end)
7 o. V$ t* c( m) `! K' \5 @# K4 Z' ^ {
- B7 w" ^: i3 H8 e+ }. a8 n for (int i =
; b- G/ _4 ~/ t! T; `0; i <= begin; i++)! F3 N8 Z. n T7 Y! n
Console.Write(list);
* j1 I% R( ^# \ Console.WriteLine();- {" V D$ F1 E( T! Z7 u0 ]
}
0 f8 R% }! P7 M7 ~. G' B/ P else( g% |1 V7 y& y- t" i
for (int i = begin; i <= end; i++)
: F2 L1 M. @ M3 w {1 ]' [8 u7 c( ^4 {
Swap<T>(ref list, ref list[begin]);5 t/ o: ~+ s$ K- M/ |1 V8 r% z
Perm<T>(list, begin+1, end);
) y# r/ t( O% R: g$ p2 C+ { Swap<T>(ref list, ref list[begin]);
' v1 M: l! ]8 I/ ~ }
6 f# e# b. m6 ~. a }/ A" d% r0 Z E8 W8 Q& ^
2 U# S: y% {$ s) S6 v
static; i& m6 c6 Z* Y" Z3 [: W
void Main(string[] args)5 o1 ?% W$ `7 G: B2 j/ I# I
{* P% Z3 z2 R2 Z* J) M
int[] list ={ 1, 2, 3 };1 V7 C8 P8 n( R8 C8 N) X. b* H
Perm<int>(list, 0, 2);
0 e. a( A! s; l" y2 P; O }1 y5 g0 V2 H5 Q) p
}
$ |5 g! ]6 V2 j% P* y* i. V9 n}
9 k( I4 K& u2 O, t% F m0 R7 f3 O, ~3 P |