马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
郁闷 没人来给我加分!! v+ ?4 ^6 x2 {% U9 \$ n
假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:3 t' Z+ W2 S# d* S" ?$ ~
{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]的全排列"。
9 ^ n6 ^/ D# @1 q 令int list={1,2,3},所以:
$ q7 j; l) D3 k+ w' h) c- o5 K: Y perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};
! j# I: \0 t8 [" a* l, a% ?# {- p) A, |4 W
+ B! Q: N9 ^# _7 D% ~& g4 m; R 理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>8 i5 B5 D" ^0 ^! m) u/ y$ F
typedef int ElemType;
+ J C2 p5 B" V7 K2 D/ |# ]7 C4 o- d% @+ l
void swap(ElemType *a,ElemType *b){
7 f' ~* i) y9 K //交换2个数
( u/ C8 _/ P+ h4 g/ Q, i ElemType temp=*a;8 e8 ~8 D; [1 Z+ ?7 h. L# g& g
*a=*b;
8 \$ J9 z$ y7 F: z# a3 ~; I6 Z& f *b=temp;
0 M# G/ L7 w) O: i& [1 f}//swap
+ V& x( j; V5 t3 T8 l5 a2 {% E" G, f) ^5 q) b; U6 z( D
void perm(ElemType list[],int begin,int end){8 ?. V5 {8 Z! {* S6 k
int i=0;. A" l& e/ v7 L8 V% W
if(begin==end){
3 h' L& K) R; J# L for(i=0;i<=begin;i++)
4 M+ ?1 z/ E9 \2 M* x' r printf("%d ",list);
( f+ Z. c! r8 W, S printf("\n");
5 W: q5 _5 v* o }
$ _ w7 O/ u. J0 x g& @0 [ else( m7 B+ p* \. [3 r# F
for(i=begin;i<=end;i++){9 y9 |+ y* ?8 o+ x
swap(&list,&list[begin]);
0 B9 i, Y8 o; t0 b perm(list,begin+1,end);
% F) Q* |0 L% f* \2 I) p swap(&list,&list[begin]);* \' y- v# B a% [8 B- w
}
4 x" v' w6 H- S: I( d V}//perm
3 ]8 h5 o" i6 Y8 @$ O- H6 r
4 ^' r6 J- z! p p2 @/ k( p: qvoid main(){" O8 G" N! n9 ?3 o. ~2 y
ElemType list[]={1,2,3};" f" J& X7 F5 L* V! O
perm(list,0,2);
2 _2 n) ?8 L7 d9 ^4 T& _}
; D& N$ G, E9 k$ W4 ^* P
$ U) P( z: |! a2 X4 l+ [" R# z! D. P# r" n; n
# `$ x5 w! i7 ~# kC++代码 #include <iostream>
, i, o# K. |, s4 b0 V4 r8 t* P3 G! a: h' ~8 L5 J# m
template <class _Ty>
. O/ V7 ]1 B7 b: qvoid perm(_Ty list[],int begin,int end){5 o" A. u) c6 ^. v) h2 G
//输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;7 S0 Q: O, g1 H" q/ k
//前缀是固定的,求后缀的时候要用递归求/ \3 w4 D4 R& J Z. b D7 U
! Q) h5 e" }; F5 dif(begin==end){
' x% g4 c0 `6 X2 R8 \ //如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀& `$ U0 d) a6 E" I; |
. o. f: V2 w f' c! v
for(int i=0;i<=begin;i++)
9 \- ~. x. m7 v6 X6 t# o' m# h std::cout<<list;
4 O+ P( k& A4 b- R- V+ S std::cout<<std::endl;//输出一个之后,换行
# v4 e a2 M$ O( @ y# `. L }
" v$ s# K$ ~. g- W6 C4 P- ?, M" H else{" P, b2 g L! l
//如果不相等,就要循环(end-begin)次,每次前缀都不同9 U/ v% G4 R2 F! Y7 l
! ?1 m8 F3 y+ C% m
for(int i=begin;i<=end;i++){
# X3 @- C- W; _3 O1 J" H! Q std::swap(list,list[begin]);//交换之后就可以得到前缀了 h0 j3 z0 V& g
perm(list,begin+1,end);//递归输出$ G: u* J1 I$ O" i' N. y
std::swap(list,list[begin]);//换回来9 ^3 z3 o6 R0 ?0 t
}) b7 o) J. d, Q. o+ m
}
* N. N5 H+ V! D( T}
% D+ q, C# c# g/ V; t7 y& f2 X( C
* U4 T2 @2 I- A, b1 yvoid main(){4 A8 R0 P4 x5 L+ Z4 }4 e8 t' s& e
int list[]={1,2,3};
: S7 V% d" {8 X/ m/ b perm(list,0,2);
$ c- Z8 X' c/ [# q+ s! E( a* A9 K+ x}. t- K- v) ^3 L7 D5 ]
0 m* c" F# \7 p" W) b
! J$ C1 P* z, p8 ?: G! Z
C#源码 using System;
: W1 T4 f+ G& j' Husing System.Collections.Generic;* `$ ~# h2 z, h( `3 z( ]$ b2 M; y
& j+ d% a/ B' d1 M2 A
namespace CSharpDemo! @$ K, f" z4 y) ?% c e( t
{8 b3 V. Y- `) @% E4 u
class Program# Q5 C9 c0 [, K3 c1 b/ c0 Y M
{! x% N7 p, r! T
public
% q, x* }7 F- \$ \static- |+ a" y, G, z5 L& S3 H
void Swap<T>(ref T a, ref T b)
0 d9 v1 j# R( A# k {
+ y0 R) [: G4 I8 M5 C6 b T temp = a;
6 Y; G& L/ U/ k/ m a = b;+ E) S$ F- V/ D$ L: [& @
b = a;; l; F9 |! N2 E& e4 b9 R
}) C* _6 V: q8 X3 ]4 _" E# r
' f, ~' B! ~, ~- i" X" a
public8 {: [( v. k2 I! ^; X4 A
static4 v$ T( r/ E* \1 O3 x; h# n+ ~
void Perm<T>(T[] list, int begin, int end)) ]8 Y- z1 D; v6 c, L2 `( d
{
( r) Y# q! E7 ?+ d' d if (begin == end)
+ B7 E2 X4 M4 H. O- A5 b {
. j# f, Q2 v: W' r for (int i =
: a ?( J% ^% f: h. b- y0; i <= begin; i++)2 E0 g r1 }& q( \* M
Console.Write(list);
c; g. `$ y4 ] Console.WriteLine();, o9 z0 G! @. o7 h
}( n; {# L+ Q1 W5 a' M5 ]# c/ v: i
else
" V+ S9 h. a% s" l/ gfor (int i = begin; i <= end; i++)
& T, h% `- I6 @1 z+ f {& c4 M/ a7 {7 u
Swap<T>(ref list, ref list[begin]);9 q7 q4 Z# _: g4 L9 h
Perm<T>(list, begin+1, end);
5 f- I7 ~( E& p: } e Swap<T>(ref list, ref list[begin]);
5 K( _% p M5 P+ g9 _ }
1 ]4 z6 d& p8 T- F' H' i }/ ?, T4 u+ ]+ A' M* s/ \
2 h7 f6 r- e& {4 c static1 ~" f/ @9 {$ @7 T/ R& L1 a3 Q
void Main(string[] args)* |- s2 r* C$ l
{
, ^8 b2 ^, W2 R0 S6 T int[] list ={ 1, 2, 3 };
" I! X2 T4 ~( Z/ V' z8 V1 p Perm<int>(list, 0, 2);
/ `/ N+ K% R) \0 r& K( _ }, O" d2 b1 l* [- o& S, n7 I
}( D, n, J0 @- W6 G% U$ t
}& s! \8 E8 ^% Z! E
|