QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    9 ]8 P3 w$ {0 Y, V' l
    & t3 K! o0 L( b, n& r% q! k
    . t+ T, ], W4 P  _! h+ ?/ c
    /*8 _0 j! a# U' w. \5 G4 Z
    使用递归方法求全排列
    " p4 D- y) v  r; U1 s' w7 g# z: @*/
    8 ]5 p7 }& O+ L2 i% a# D2 o* x- F! ~, K
    #include<stdio.h>" C2 n& e1 z1 S- ?

    $ p7 g  ?, H! m# Wint sum=0;
    9 h6 A5 d: [, |- J: mint main(){
    * f! c1 o! A5 \4 k# {$ S        int n,i;
    * O8 v6 c) a( u+ Q* _        char *p;
    7 Z7 z: S3 |/ l+ A9 z' q1 T        void perm(char *,int,int);( n, v* E% Z, y* S1 \
    ! ]/ \% ~3 e4 z& e
            scanf("%d",&n);
    % u7 {2 w: \/ p        p=new char[n];
    ( s: U! O$ _( ]" T% C: {1 ]        for(i=0;i<n;i++){
    1 q+ j  B: H( z$ d3 u                getchar();
      X$ d+ l; G3 z/ k# g                scanf("%c",p+i);
    6 Y' j! Y; n* g2 L! J        }
    3 j/ w" u( J/ v( e! x& Z/ N5 C1 g4 ?+ F4 h" Y
            perm(p,0,n-1);2 x/ @2 t8 O. }  |1 q
            printf("==>%d",sum);. }$ _0 i! p- }3 p
      o0 ^  t1 m: Y8 \6 q  C
            return 0;
    1 L- ?/ k5 y* G7 g% _1 _}
    8 \  l1 F, ]! B9 G4 z3 ]2 S% [, d% u6 S: \' J+ H) v
    void perm(char *p,int s,int e){
    ; V* V! r% R4 X. F        int i;
    / X) v: o% k, i! w        void swap(char*,char*);
    ; z# B) }) l; y+ _        : r! L. B( u( q2 h& y; a/ F
            if(s==e){
    ; U; r) C! B! `+ Q                printf("%s\n",p);
    & v$ f6 _4 Y' i2 T. [2 [* l. N, }                sum++;
    4 N% w6 i% M  i9 S7 d                return ;3 w$ l8 r6 d! w2 Y/ G. ~
            }' h+ [7 |( ~" d/ P
            else{; A! p) p8 `: g  ]$ P
                    for(i=s;i<=e;i++){
    . |7 O( \2 R9 s! \                        swap(p+s,p+i);
    ' t8 e) C9 I4 ?& P0 U$ f7 v" f8 `                        perm(p,s+1,e);9 M( ^/ {+ k! l- e
                            swap(p+s,p+i);5 F1 T& U4 V5 A9 a
                    }7 B. {- ]+ G4 L$ s; @8 M
            }+ d! m" Y: K7 N, z/ F
    }- n: |. G. i: S* ~! q

    . I" I5 r+ e( I( n# ]5 ~0 |5 o) j  I  jvoid swap(char *a,char *b){
    ! n+ S. O9 n* C+ S# P% X6 w        int tmp=*a;  H6 @" n( X% u8 b5 N) Y9 a
            *a=*b;' J5 }, y  Z$ W0 ^
            *b=tmp;
    . H% ]. ~! J1 c}
    ! `: O* a5 v' T. C8 z
    # ^- p, N# x- l" s# Q* [+ ~. `======================================================================
    % v& o0 h* Z1 [4 i6 O8 [" c. n    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。+ P4 Z1 V2 V- X/ Q7 l* L! i
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!0 G/ }' r& _( k6 s; j
    0 W8 o+ `$ b7 X( `5 o& |. h' t) R

      y3 r6 c& R$ `# i3 {# H1 y# m6 b+ ~4 h/ _4 F3 X  h
    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-6-13 23:02 , Processed in 0.371215 second(s), 51 queries .

    回顶部