TA的每日心情 | 慵懒 2016-4-21 12:07 |
|---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I 累计签到:3 天 连续签到:1 天
|
|
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
郁闷 没人来给我加分!' k6 n" o2 j+ m2 E
假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:
. j- k6 n: e% i+ p. H( O {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]的全排列"。
! H1 Y. ]; u/ S 令int list={1,2,3},所以:
' J# N# E8 K* ]. ?4 b4 T5 _3 ] perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};$ u$ w% f7 x) N7 D5 z M1 h
$ X/ v& o7 \ U. P- \3 k
* S! D/ j6 X. n+ s7 M) x# j z 理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>/ C+ E- X4 o- [% k7 u8 L; ~
typedef int ElemType;' U5 ^2 H' ?& N% T5 B
4 j, `* r, P: Q; `+ K$ ovoid swap(ElemType *a,ElemType *b){# X! N# P" k+ l+ p1 g; U
//交换2个数
# E2 x# ^9 c- P; T9 g ElemType temp=*a;+ M0 |6 l# [6 t+ y& {6 `- Z' c
*a=*b;* d+ f& ^6 c; a0 P. l/ m$ r6 l
*b=temp;( t& d3 H# ^+ ?( M P F
}//swap
* S* {3 b, R+ @# D+ ~0 _* ]% |% ]. R+ ]! Z \
void perm(ElemType list[],int begin,int end){- X: l/ N; {1 G1 f3 Z
int i=0;) |) q, F* j$ I0 E
if(begin==end){6 b. f0 F3 N: U8 O. y
for(i=0;i<=begin;i++)4 C7 W9 E( s& o. W0 w
printf("%d ",list);+ v' f8 i3 c4 t" Q
printf("\n");1 f- s, T% a9 R: ?# T% w3 ^
}" y y8 E/ q7 B C% M3 ?. Z
else8 S2 n0 G4 ~! f( X. q
for(i=begin;i<=end;i++){3 O! ]1 o; p; [. t- N
swap(&list,&list[begin]);
: o, f d7 e+ H* l0 L4 ] perm(list,begin+1,end);4 w; }+ |4 B0 v- c2 R2 U- ?; J
swap(&list,&list[begin]);
+ d3 d' a0 ]6 y a }4 T& E7 [7 ]( Q! p9 g- v. N
}//perm
5 o% @0 q6 l# |2 s4 Y% H% k& A
3 o+ {( k" ?! b) }void main(){# s6 |) g7 ~) j4 ~! G
ElemType list[]={1,2,3};
' |7 [9 M3 L4 Z) ]. \; M perm(list,0,2);
, b2 z9 v2 ?% u5 a7 @} 8 u$ k, ^+ Z9 m# m" p
: V, P; p, q& I( I5 b
- D _1 G" ~$ ]4 Y3 W3 J
! a6 R+ Q& k* ^4 d7 G6 L- b4 yC++代码 #include <iostream>7 T8 j; F/ ]& Q5 v5 R; k6 Z
, J2 d; Y* m- m) ?7 K e' _: u7 F
template <class _Ty>9 W6 G* l# u7 l
void perm(_Ty list[],int begin,int end){3 X0 N2 z c7 P# D, V
//输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;0 ^7 x( b" F$ Q# ?- r* e5 N
//前缀是固定的,求后缀的时候要用递归求
" i4 }7 x( b% N" i6 S4 {) B% q8 C/ \6 i9 Z) j# ^8 O
if(begin==end){
( i+ U, }9 D% j6 V/ a2 a. c* [ //如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀
1 Q3 w( P0 `% J7 s9 x$ p- U+ ]" g0 @
for(int i=0;i<=begin;i++)0 [3 m" S, n6 z& z
std::cout<<list;( k- e% o. _) y K2 S# h% n
std::cout<<std::endl;//输出一个之后,换行* J' `0 e5 R" ~8 }+ B) i
}$ ^* c/ v3 K$ h9 E" ^5 a9 O
else{
7 k3 u. L1 `; u //如果不相等,就要循环(end-begin)次,每次前缀都不同/ u$ ]# J! v: s# }4 k/ v5 d
5 x/ e: E* E& ~$ Y
for(int i=begin;i<=end;i++){. f! E1 m+ f7 R- u
std::swap(list,list[begin]);//交换之后就可以得到前缀了8 x* i9 D* V W
perm(list,begin+1,end);//递归输出
) p- M; U* ~9 n) } std::swap(list,list[begin]);//换回来
% l) u8 W9 n4 G* Z7 x- l+ G9 J9 E }: n* q/ H" G% I% s7 w M
}
$ X$ `5 c& z& B7 L ?6 Q# d. U( ?- q}, X) x& H; N: a' c6 D
1 v$ s( D( V4 J( p, c
void main(){
6 S( J' | m) s! b$ L int list[]={1,2,3};
# T6 x% Q4 }/ ~ perm(list,0,2);3 _' Y: w; b2 H, d
}/ ?% r" j3 [9 C$ }+ q
$ z" V9 O$ Z; H- d; ?2 G @
0 }3 Q8 j! V% A# T* S
C#源码 using System;& | T6 D" P8 H" Y0 T z7 _ z& e2 _
using System.Collections.Generic;* `/ B8 K' d0 K, D$ }# |
! m/ h5 r8 [3 Q8 }) n3 C
namespace CSharpDemo9 `$ D; _* X6 {" A
{* o1 k3 I6 V" }
class Program
4 @. ?5 R h0 j$ x s* c {9 p4 f( i, X. I; S) B v
public
- M: z6 A; _( V. ?$ |static
* h' r4 Z) f( @9 Q' M' m+ c6 bvoid Swap<T>(ref T a, ref T b)" ]6 G5 H( s/ a: c7 g
{
; O. P: I: _2 I3 s. B T temp = a;
* o! k! g3 ?/ U! P1 C a = b;
6 ^/ p& I. w# w. |7 u1 P b = a;/ n/ S4 B' b# C% D
}
. [; ]5 N- S0 v/ T$ v9 |+ K$ j" ^! X+ }# e% c
public
( j7 c/ ?' B& X& B8 G2 ustatic+ q; u& Z C- @; x# R! c- t7 u$ ]
void Perm<T>(T[] list, int begin, int end)
; n6 g# s- e7 L% A0 A' z# ? {
) ^4 z) r. H9 @7 N7 g7 v) {6 Q if (begin == end)
" n, A7 D4 E, p, ^9 l {
9 g( A/ n" S6 l; @$ H- `! J0 p for (int i =
$ M2 E# |: e$ v2 F& [7 O+ }% l7 b0; i <= begin; i++)* c/ e. S- |2 G- x
Console.Write(list);# R4 Y. h, [+ C" R! U( c* E
Console.WriteLine();. F% T5 Z1 ]! _6 b3 G& W, b6 p2 E4 t
}
3 M. p" X7 i% v3 n9 D& O- m8 O else2 [1 ?8 i1 P: V1 q& l" m
for (int i = begin; i <= end; i++)
$ \' }" t9 y, O) G/ N3 Q" s {9 U) w ?# v2 X+ { d
Swap<T>(ref list, ref list[begin]);: x. V( s0 E* D; o, s
Perm<T>(list, begin+1, end);
D$ `1 g- J- | Swap<T>(ref list, ref list[begin]);* g0 j! N) x h- @" R( P
}! x! S' t; ^2 m8 C. W! s* J4 G
}2 }; j) }+ p# X0 n! @& p: s+ M
; p4 f1 S2 B8 ^& W6 |4 u4 s- W static
$ @1 c/ _7 L8 V( ^# Qvoid Main(string[] args)
) D- ~5 z6 p7 Q3 n" ? {
# a; \1 V6 O: p- a! @/ A$ o int[] list ={ 1, 2, 3 };
' {# I# ]7 m8 r& z( P4 m: v Perm<int>(list, 0, 2);
8 q. Y* x, Y1 b; X1 F L5 P; J0 E' v8 p }! P. T" h3 v- _( f
}
# Z3 e/ C" W+ C* H: P/ H4 D}7 [. L. X( j$ x4 E* b6 A- D# v: J
|
评分
-
查看全部评分
|