|
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
郁闷 没人来给我加分!
4 E8 x7 f l8 A) P1 u+ W9 A; f6 u假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:
, | J% B* W3 [3 i! E/ e4 ` {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]的全排列"。
" e7 B. {, m2 Q2 Z# X u% k; \6 W 令int list={1,2,3},所以:7 l* z s: R7 `) b1 c( @- G
perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};) ^* o1 p, ?7 R3 ?2 ]
?$ U2 Y7 C, w6 G# K l
: h6 A) e* y6 H- ?! t 理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>
$ q* r6 n& G5 X4 Q! c2 ltypedef int ElemType;
/ Y& w( O; y3 s; t- ]
; T& Q! q* @& A, }# V9 a2 l! yvoid swap(ElemType *a,ElemType *b){
1 S% i+ H( ^) j0 q //交换2个数+ r8 L q# R* K r* S5 o
ElemType temp=*a;2 j, w3 E% y9 a
*a=*b;
- L% Q+ w# m9 p" c* b; |. [ *b=temp;3 R+ b, w7 h) B% E- h
}//swap8 g5 Q& ]: P, D$ @5 p
8 C: V( w8 Q G3 C% O
void perm(ElemType list[],int begin,int end){: d7 Q v4 y9 L3 D1 e( t
int i=0;$ p; K' i$ ^7 g0 X4 ~2 A$ L/ F
if(begin==end){+ f$ `$ V# K, ?
for(i=0;i<=begin;i++)
+ `: S# b4 k/ C printf("%d ",list);/ ]$ c, F4 T) _
printf("\n");0 e! W+ g% p" {1 o
}6 N% h# y1 o/ G8 i+ |* S/ Q
else
0 K# h4 }$ l/ o. B- i4 q6 D) u, {for(i=begin;i<=end;i++){
/ n8 b/ C4 g# Q5 \ swap(&list,&list[begin]);
) x% L5 @7 v- ]9 a q( \ perm(list,begin+1,end);" S9 \/ N1 B9 P* M! R
swap(&list,&list[begin]);! D' V" X8 {+ |3 q7 f" f
}
2 { O1 |) @: T$ e# ~}//perm
# T2 O( \% ^3 A8 F
8 M' G$ N1 @" Wvoid main(){! x9 y$ H0 t' V; a. N4 u" A6 d8 I
ElemType list[]={1,2,3};1 C X% a5 ?. j3 \
perm(list,0,2);
+ y6 _4 F/ ?5 `! _9 N9 m5 j q}
: Y6 @: L4 r0 F8 l* i: ?0 t0 Y8 J) ?$ \" \9 u
2 a# C) W2 D1 W; f/ K- I
3 \ E6 w6 t: ], _C++代码 #include <iostream>1 Z8 p0 q) Q4 z' i
; _9 X: n" ]& o: V# r
template <class _Ty>9 F; `: t0 L7 n; D) i$ _, _
void perm(_Ty list[],int begin,int end){' F I6 j* ]2 |4 D
//输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;
/ `! O. F, }+ m' Z$ M/ }+ E5 o //前缀是固定的,求后缀的时候要用递归求4 h6 L/ p! X8 l; t0 w8 l
' b1 z; p& p: N1 S9 u) e" {
if(begin==end){
# \) G, j; e; k6 ? //如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀
; X( o0 n1 H: P* ~, n! V0 d. |8 S) s5 M/ Z+ ]
for(int i=0;i<=begin;i++)5 g/ v' G: R" W' G/ c; n' x
std::cout<<list;0 [8 l, t- e( d1 l8 ] F# }
std::cout<<std::endl;//输出一个之后,换行
) _( D, C! E7 b" h; X s, ]+ Y2 r0 q }* L* I+ L+ D* ?1 Y5 M! O
else{
8 }+ u/ ~" c* S ^ //如果不相等,就要循环(end-begin)次,每次前缀都不同
2 p A) R1 l5 }- b/ R/ J# G @; W- ~0 I) F6 [/ j; w
for(int i=begin;i<=end;i++){
; _# E9 b8 ^+ r6 @' D6 p) p std::swap(list,list[begin]);//交换之后就可以得到前缀了
# a- n- F/ b: r4 w X9 ~& d- d perm(list,begin+1,end);//递归输出$ }2 c/ r5 D& G# L9 X! Q& I! _0 S
std::swap(list,list[begin]);//换回来
; O6 f. a. w( V# w$ n# e }& c8 ~9 o4 f5 g) R$ b2 }
}
2 m* Z2 j! D# @! E: W8 z' U}
1 m8 x2 v7 N" a" f* [
9 l E( D) |2 u" G. avoid main(){
; p% M9 i6 I. S' o% C- n int list[]={1,2,3};, E' e; a% `& W: z/ P V$ K
perm(list,0,2);
. F! C1 V: @9 `}4 D/ e! P( n2 }4 e/ [
- n- N& d3 h1 K
0 P$ X$ A/ O C# L' @! e0 D( x
C#源码 using System;
/ _5 {- t7 [3 g, z4 Rusing System.Collections.Generic;
' {; r9 n- K: q
& {* o2 x# t4 [7 u% qnamespace CSharpDemo
1 q7 c; z" A/ D. l+ J{
" s6 m6 |* q2 b2 d7 K class Program7 |. S# f& P7 F# H
{
, l/ g- o* d4 k+ X public
$ @2 G, j' L$ M$ b1 Nstatic
( e: B0 o/ L X2 c" t6 b3 I' q6 ]2 pvoid Swap<T>(ref T a, ref T b)
0 n# g0 z2 X; J/ ~+ b$ V* L: ?- z {
5 u \0 K% p! d1 ?, G T temp = a;
% E8 f4 H+ b. y+ L: _ a = b;
) _+ k6 @ q" q6 [5 G4 q$ t/ c b = a;$ j7 O. m1 N- X6 w" ^1 [
}0 M: F h' _; ?) i
6 L+ b Y, l* B7 e public
- P8 W$ B0 q% u3 S( O7 G2 b, Xstatic
$ w5 U5 Q4 ~! `$ m& _void Perm<T>(T[] list, int begin, int end)
& O, B& N6 u' f2 Q& W {( q! o; z" K. E& I4 W
if (begin == end)
3 K) `! x4 V* a. `# M; [! T+ F/ B {3 |) J0 X! Z9 e7 |3 m1 s
for (int i =: F( S2 \6 U0 x j: F
0; i <= begin; i++)
! z, W. T! a6 v' m* O7 e Console.Write(list);- w% h) w# k; N' n
Console.WriteLine();
Y s& e; y' w! H }! C: k" l b1 z% g. U0 D
else
8 K5 F# t8 G: H- H3 Mfor (int i = begin; i <= end; i++)
) N- h# p; `* k5 R: [" ] {
, X v' X1 I/ ]& _6 T, d2 K2 s Swap<T>(ref list, ref list[begin]);
2 f. F3 e6 r5 o0 B) U Perm<T>(list, begin+1, end);2 q: `3 T. a% a; A+ J8 ]
Swap<T>(ref list, ref list[begin]);0 H& t8 s+ \$ h" Y
}
( S7 b, b; g7 A# j' n% C1 l }
0 u; J8 w7 a; W$ ?0 |: v' S. q3 \8 g. m) U% c
static
1 \6 z) O/ t6 ?9 Ivoid Main(string[] args)
( r! V. m2 T7 y: G9 s {
( c4 U$ P1 i$ K( T# m N- ~2 d int[] list ={ 1, 2, 3 };
+ I7 p) c4 D& c' i9 f Perm<int>(list, 0, 2);& ~8 |. X$ X! q" R, Q0 k
}8 @5 J/ N! c/ b( E& n$ X
}* k) U7 E- C9 c+ v" m
}
3 B/ M( h2 ?. L/ U) q) Y/ ^! u |