马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
郁闷 没人来给我加分!
! R* Q9 n }* B6 M6 `- e* h假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:/ I9 | F' P. l' Q# S7 X) p+ d- [% H
{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]的全排列"。3 T0 S) s$ ?9 z5 Z" p5 G
令int list={1,2,3},所以:
* @! Y- @& X4 R) u" a6 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};+ M4 l8 M! @# w; u4 a
; _7 s8 M; e" }4 c, H4 X( x
' V' `/ l/ ?7 |' C6 r" E7 s* y8 L
理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>
: \+ Q% A5 }1 {6 t9 X* vtypedef int ElemType;
1 w0 q3 |* j. r
, e4 k9 c. _4 cvoid swap(ElemType *a,ElemType *b){
( A6 [/ @, w* m6 Q Y. _+ B //交换2个数
7 H- @- y1 l# @. M ElemType temp=*a;. T2 N, _9 U- o/ [$ N
*a=*b;6 c- U# E% D4 n# U$ m/ C9 t
*b=temp;$ I$ U7 b# G- f2 Z
}//swap
- R( [0 [5 c( {1 x4 o3 ~
6 O7 W0 I9 S) ]( g: W* Fvoid perm(ElemType list[],int begin,int end){6 s% Q9 d6 N# j; P
int i=0;5 h6 |% A! T9 I$ n. F6 Q
if(begin==end){7 v' P9 _8 K* c
for(i=0;i<=begin;i++)5 t% @: u- C3 ?# _2 g
printf("%d ",list);
7 U% J* T2 l1 j2 P3 E( H printf("\n");
. I2 D7 E0 D( T. B. Q* o- O }
9 a, E/ m, a0 `) J else* E9 ]1 J' F+ L
for(i=begin;i<=end;i++){2 K8 q ]) W# T# t
swap(&list,&list[begin]);
2 P8 d8 J5 l3 N1 b perm(list,begin+1,end);
$ q4 X0 L4 X& h swap(&list,&list[begin]);$ M+ P' w! ?- u" U A
}3 p! L7 }" ?4 f
}//perm
& u- v' @' L( ~+ d% v& W }* T5 U! A7 L4 e
void main(){
* c0 A- K4 W. I ElemType list[]={1,2,3};
6 X* O/ [+ K9 Q/ H perm(list,0,2);
& ?$ V3 d9 K/ l1 ]7 H0 t1 t}
l, f- r: ]% D, Q+ v; S, W5 t7 I
4 g( N8 q, F% e- k. h6 w& i$ X% ~+ W$ @1 f- w
0 d& B& L' w. EC++代码 #include <iostream>
8 m T# f L/ ]; R' S2 ]
8 s, _. E) |. `6 b4 N. ctemplate <class _Ty>
1 L& g1 S' r1 e3 c" ^6 pvoid perm(_Ty list[],int begin,int end){
( e5 f- X3 F: Z" V! E4 V //输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;
6 b' a+ k9 C( W# G, [. c5 c //前缀是固定的,求后缀的时候要用递归求) t, g1 h, g. L4 B# \1 r0 X6 ?( ~$ K. Q
, e, k: Y2 K" r p
if(begin==end){% O# G( T- Z) B
//如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀+ E2 `3 d( f+ l0 C
9 Q' [. N8 W' @1 a. L+ @' h
for(int i=0;i<=begin;i++)
# K! M% \. G% t' ^8 Q std::cout<<list;
6 B [, ]2 i( M) h std::cout<<std::endl;//输出一个之后,换行7 Z3 ~8 P2 u% k& g
}
7 j6 q- Q4 _6 c# U else{+ u, ]# z9 U+ S( T% [% c9 d
//如果不相等,就要循环(end-begin)次,每次前缀都不同* \% H5 S% F2 c! a
, i+ ~6 O9 l& o5 Z% N% F& O" V# }
for(int i=begin;i<=end;i++){
- ?' f% R* G0 j! E std::swap(list,list[begin]);//交换之后就可以得到前缀了
/ i, _9 S4 P5 t! q% M& b/ w8 o* l perm(list,begin+1,end);//递归输出, j8 t0 o3 n* o0 ?
std::swap(list,list[begin]);//换回来0 {5 I4 Y( ?- }3 O2 H
}# p# r2 |4 A7 k( b
}
; o5 s9 F. K- u}
! r+ P; g5 i; L5 i' t/ a/ k9 l
$ ^ g, O8 f, S2 J4 }void main(){/ P: X; U; v1 k" G1 C
int list[]={1,2,3};
5 Q/ e) w" z% y perm(list,0,2);
4 h ?* ?$ c0 J* \5 @}& X) P$ M8 f% |5 W0 s8 h9 V: n
6 c, M, X% Q9 ~* t9 _
" d* ^) D0 ?! q6 g
C#源码 using System;
' g$ f4 |8 s' T2 l/ V B+ X9 ~! _using System.Collections.Generic;/ ?4 b, L: ~ y! L4 ~4 S0 [7 E) o
9 O S7 B; h- ~, s: Enamespace CSharpDemo
/ V( l' X0 W* c/ c3 a4 g{
* L A6 _$ S- `0 R5 K class Program
4 s9 u3 P. w" c& e1 |# L1 V {% O- s- ^+ F/ e- r0 I x
public
- p0 e+ ^ a6 K, S7 S/ ]% {static9 J% A2 ~$ l7 v5 u
void Swap<T>(ref T a, ref T b)" A: R7 N" _: e4 J2 U9 A
{$ Z7 _2 g$ {( r
T temp = a;
/ @- H0 Z5 p q3 Y d, F9 }- `5 Z7 @4 d a = b;
6 ?4 ^( x3 @$ ]; v( N& s1 D/ T+ p b = a;& B; ~$ H x8 j9 c. e9 N
}: r( C6 ?# b4 \" s1 \) C
4 w! |) ~3 x& ~- r; O) W5 p
public4 h n1 p) e+ j- J' l# m5 u5 M" d7 L! f
static
' g% o8 q2 C3 G: `4 m( ivoid Perm<T>(T[] list, int begin, int end)# f0 u, g/ q/ p
{
. u. I, @7 i8 a1 S: E if (begin == end)0 n' w9 I' m, R
{: C) _. ?2 u* U
for (int i =' M/ L4 R# j1 P: R/ h" s
0; i <= begin; i++)
6 @# n6 Q' u) D) B8 X! R5 M& s Console.Write(list);: z* v3 ~& @* ^: O2 U+ w
Console.WriteLine();
?7 D3 p- n- j4 X }$ z/ I, T O9 |0 F4 K- y
else6 |6 v% H/ b i& ^( a4 ]
for (int i = begin; i <= end; i++)
/ r7 t- _. G9 w) X) k3 s {% I* ~% _; h$ q9 t! f; h& N E+ a
Swap<T>(ref list, ref list[begin]);4 x, _9 a, n2 G- h# G$ `. B
Perm<T>(list, begin+1, end);
$ `* K3 G/ f. e7 P% Y Swap<T>(ref list, ref list[begin]);
5 B# ]* u1 D5 e7 |& ^9 C: V: s6 X }
9 j' z8 o, ]4 v+ Q# j6 v. V }' o$ ~( ~, v1 ]' \1 W+ |. f0 [
' Q+ a) `' g2 p# \$ p z
static9 r; n3 q' q" ~6 b# B. d3 C
void Main(string[] args)
0 r/ t0 v/ ]+ O0 ~/ P {/ f% S# S8 `' `# b% T: a+ _. k
int[] list ={ 1, 2, 3 };, \! L- f- l( w) ^+ ?6 b8 S
Perm<int>(list, 0, 2);
& u. o3 ~+ F2 s' |' [% \6 w5 B }2 d) M* l I1 _
}3 O# n, o, f3 O9 Q# u6 V& C+ Z
}1 ?" t- K( s8 n. z
|