QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    5 v" W/ K1 a& a% b9 ]& v( v4 w. B( C3 y

    * @- Z2 m7 l+ q+ I- K4 y/*
    4 R) n/ y  W$ H  h( Z使用递归方法求全排列
    : i; I5 g6 H' e" I*/6 e5 g- V8 ~; M

    ( J% V4 ?1 t/ P1 k; V1 K#include<stdio.h>9 Z" S9 F/ c5 q/ `2 Q- k5 l: S7 e$ a

    : {) f$ f* E3 w. |3 p" t# L- ?int sum=0;
    ; Y; @4 G) j* i' I- k. ?9 Vint main(){
    4 C: u8 d: ?/ X3 b5 b/ O% ?        int n,i;
    ' o5 e7 M  \1 S5 ?, \$ A        char *p;% f4 i6 R& F& a. J) ^1 L% x( Z
            void perm(char *,int,int);
    " C8 {4 ^3 P0 X9 k' Z( h0 _0 T5 b! v/ e
            scanf("%d",&n);9 x( ~3 g* [! E3 y& f; b0 S1 a
            p=new char[n];1 d) f' M; M& l; K& I1 j+ i% K
            for(i=0;i<n;i++){
    8 A" @, g' q: s+ o' V# t: f, x- X                getchar();
    4 e+ w( E, j) ~; X                scanf("%c",p+i);+ B, h3 c& m9 l# L2 E4 J6 P! g; l
            }" @- e3 c6 B- j7 V# Y( A1 V, ]
    $ x' r9 `! i/ F) _) m5 f% g7 z
            perm(p,0,n-1);3 Y! |* x  I" j
            printf("==>%d",sum);% b# V9 Z) f1 E; |0 r# y" Q1 `. X
    + A, S7 h! r) }
            return 0;' P" K  V6 f# _
    }) j' m% Z6 ]* c: h- [- T

    : o: O; H7 d. M1 Fvoid perm(char *p,int s,int e){
    & p2 [  v- r- u        int i;
    0 k  Z" N" O: ?: |        void swap(char*,char*);1 |6 ]' l! {% D3 z1 N) ^5 X
            
    / r5 N  S- y$ H0 A# ?        if(s==e){
    $ l6 L. r1 p/ V# M  R. I6 ?                printf("%s\n",p);9 C/ v/ g2 N+ S* ~
                    sum++;) [% A8 V0 T' [; g1 k- u5 m
                    return ;  k8 b' W1 `% \6 u% W) _0 \
            }6 h. a9 E1 c$ T- ~/ o8 S# i: ^
            else{
    ( B% j0 {+ T; l, O1 T                for(i=s;i<=e;i++){
    4 n2 R" D( h; _" T                        swap(p+s,p+i);
    , ?2 _! f7 k) V+ ~7 J) @                        perm(p,s+1,e);
    ; X1 |  z! R) X6 R  _% V/ ]                        swap(p+s,p+i);. p! m' O: Z/ K$ L
                    }/ r0 D+ {" D& |+ x
            }
    9 q$ r" \0 d- B, A2 n& p" n1 j6 m}
    0 z% A% V8 ^( Q5 [4 S6 r# x$ z! k0 {+ D# e9 W' {
    void swap(char *a,char *b){4 k7 ^  F* E+ {* V- y5 B* S
            int tmp=*a;$ j( O* A% R. N6 o* M- u
            *a=*b;$ V$ I' p( ?8 |$ T2 p9 Z( ^
            *b=tmp;1 N2 V) P6 M9 R! |+ h+ }2 x9 n
    }
    * ]9 S, G8 b7 E4 X8 t/ m  E  |
    4 [' d; j  S6 ~======================================================================
    - \& ^6 F& f5 [8 P    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。, f& `; w0 q9 V$ E3 F) G: h, S* p
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    3 Q) }% Q1 X: {% ]2 m* \6 |" k: W& E; r
    ( G* n" z5 T: ]( o  F
    " u9 ~8 M0 q8 f
    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-7-31 10:44 , Processed in 0.290434 second(s), 50 queries .

    回顶部