QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1674|回复: 0
打印 上一主题 下一主题

算法:求全排列的递归算法

[复制链接]
字体大小: 正常 放大
知道了        

14

主题

9

听众

49

积分

升级  46.32%

  • TA的每日心情
    擦汗
    2015-5-5 09:17
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |正序浏览
    |招呼Ta 关注Ta

    1 |/ |, e0 K0 z' m+ z/ e4 x3 T6 o* O3 a4 K$ A

    ' m0 y) v6 y/ w& j3 I/*2 y# U- N' |) e; V
    使用递归方法求全排列
    * q6 s: n# O  w* b5 M' ~' ^9 A" L*/
    ' W! p7 m# v! c5 e; V$ j, W1 c. ?) Q1 u6 N! b% r! p
    #include<stdio.h>) l1 Z5 O+ {* j( T

    % v3 X- ^% s7 h6 g$ t. ]; Xint sum=0;, r, M7 Q6 C' \" g/ N$ v
    int main(){5 z$ z% N5 j5 y  O! }- q2 M
            int n,i;$ f7 ?2 ?* S1 y8 V5 ?1 v. ~
            char *p;* t. J5 i" n0 O' V3 n9 l
            void perm(char *,int,int);
    " W- I7 K& D/ I& L6 E& N
    5 M8 Y1 U8 I* j$ z7 B0 Q- z        scanf("%d",&n);
    ' }1 h- P3 B0 ?, @: G        p=new char[n];
    * h! _' X! K" v. l1 r        for(i=0;i<n;i++){
    7 O/ p2 I2 l" I/ T4 s0 X8 A/ D                getchar();: R' S  T  B( O0 O2 B1 J/ g" N
                    scanf("%c",p+i);
    , I; `7 ^4 U" M$ n        }; n& a5 S9 H. t" L+ Q8 t* J

    , ]3 R* U4 N5 [( M8 U4 p$ A/ Z$ B$ m3 ]        perm(p,0,n-1);
    8 W3 {7 p  _( k9 k) N+ C+ o& F        printf("==>%d",sum);( H% Z/ O7 T; p
    & B8 Y4 _7 B0 ]. y' G
            return 0;7 G9 M. \  X& K' u2 \
    }9 ~/ f" v& X* e0 B+ _* H/ A: ~
    6 B) z# ?6 J4 R- w$ A. Q* G2 j
    void perm(char *p,int s,int e){
    + C8 W) R: e+ Y  E$ `        int i;2 J- }* l' a- N& c. U/ [" T; {
            void swap(char*,char*);
    2 Q& `5 T0 q) p        
    ' k1 I/ S! |" f6 q/ g        if(s==e){
    % n+ M( k) V8 ~4 |" u% R                printf("%s\n",p);
    0 M8 g( a% y0 `( t                sum++;
    8 I1 f% h! K9 P% x: j+ l7 b                return ;5 ~  P' h. Z2 V) n6 @  ?! d
            }/ u) F, d' z& C  A, }6 i
            else{+ R+ K4 k! p0 ?0 B$ V& q
                    for(i=s;i<=e;i++){
    ; \1 h9 h  d/ G1 N; w                        swap(p+s,p+i);
    5 `- @0 o- U; C6 M, l1 p                        perm(p,s+1,e);& I% ^: f! W& }; [
                            swap(p+s,p+i);
    2 d1 S0 w% k; ^; z$ s4 t                }' @, t0 Y# N3 p6 P, T! H
            }
      F4 g8 W5 B; z- X+ ?: M3 F& V0 _# r}
    4 m' ~2 c4 J1 \
    ' y9 w4 K) Z! N! ]( N& x4 Jvoid swap(char *a,char *b){! V+ F# e% S4 U0 V) j( @! t7 V
            int tmp=*a;
    ; j1 d7 k( A' S% B) x        *a=*b;
    ! d( h+ l) r9 h! W( `        *b=tmp;
    $ s1 ~  L7 ]3 y1 k* [# _$ r' D}  Z$ l8 B( N, k0 ^! e! y8 u

    2 c. ^$ j2 j* X7 m8 d- a- a1 D======================================================================% W0 c9 ]4 h/ T2 N5 y: v1 d
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。+ n* y$ b1 ?; {+ K# T+ A1 x
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!$ g  l8 l+ L- F: b3 `

    ) m; Q1 y( a" D4 c( y, j
    # q- L0 v3 R+ \$ y2 y; F1 h
    5 z' v' _9 J8 d7 T( w
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-14 15:50 , Processed in 0.395886 second(s), 51 queries .

    回顶部