QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    8 C# l5 Z8 z! A7 H5 d, C
    2 l1 S( P1 W. M+ ]$ T7 J

    # q  s0 P/ i6 N7 x6 d/*+ n9 l. Y! l1 ~7 b% I* t
    使用递归方法求全排列
    " x& Z( O) _  ^; l" Y: J; \! h. @*/
    % ?$ Y: R# j; j, V9 B/ G% K. v9 e) e
    #include<stdio.h>
    - z3 T% m& I/ @% Z  M7 ~+ S) `8 p8 f
    8 _4 c9 u% ~9 p! Y  H# j6 s3 J6 `8 eint sum=0;
    . {1 i( g6 @2 e: a2 Uint main(){5 v) R  A8 ^% A* g0 c9 @
            int n,i;1 k) d  l2 S: `( w. Q9 K, U4 X5 n
            char *p;- a% ]3 s- R3 q# e' U8 ]. K
            void perm(char *,int,int);8 L) r# ~2 X: K2 \

    " A2 N4 L$ f3 t8 f        scanf("%d",&n);
    1 F9 @8 K( Y! l/ `0 k" j        p=new char[n];# X! @; @1 A! e- u9 b5 V
            for(i=0;i<n;i++){, I0 \' [2 v0 M0 k5 x# b; m( d
                    getchar();
    2 `5 d! V' q) [4 I9 ]9 J+ U& y9 s' H                scanf("%c",p+i);$ r: `5 n' M9 Y; m
            }
    ( V6 P& N, G' W7 z& j( ?" n5 N9 d7 t, q1 }
            perm(p,0,n-1);; b6 c5 s9 m1 A* @) H
            printf("==>%d",sum);
    ( k) L( D7 S, Y, n
    0 r/ \& a1 q, F        return 0;
    ' E( ]. y" t/ Y3 c' K: O}+ Q6 t7 D& v  `4 X
    " |6 [# W  r! U% q* K0 _" Q( o" s' p
    void perm(char *p,int s,int e){
    & V( L* w6 R% n7 _  F; K- o        int i;3 F" V: ^  q; m+ U' v3 |' N5 d# x
            void swap(char*,char*);
    & u4 m0 I' h+ a: H# R" W& f( O        2 |  o! k$ g  @* N  t# s& D
            if(s==e){9 b6 |# k. }0 _/ j) Y+ o
                    printf("%s\n",p);
    " x7 M+ S6 p9 t/ r$ ?- W9 U3 U                sum++;
    4 H8 J* @; @# A; m5 n% W9 z/ R                return ;, c0 u1 A. y/ V% M2 W# {
            }5 l4 f9 ~* h: g$ ^5 q
            else{
    % |) Z- }: N5 w6 v8 I# K2 E                for(i=s;i<=e;i++){. _6 D, O$ G$ `9 |# L
                            swap(p+s,p+i);
    # o/ k3 L. u4 h9 |2 S# b! Y                        perm(p,s+1,e);1 R, x& e% Y9 B/ R" v. Y$ [
                            swap(p+s,p+i);
    : q0 f, v6 w' G% I  \  _6 y                }6 m& X5 y' O; h! j- Y3 B( I
            }1 o1 m6 v5 ^5 G
    }" ^3 O& {9 B7 k* \+ c0 a
      `( m9 y' ^+ B1 z
    void swap(char *a,char *b){8 r6 P# B; h/ M+ h  s3 M& ^
            int tmp=*a;4 d4 H: H6 ?$ t& w" ?/ G; Y4 q8 T, A
            *a=*b;; m) e3 t: {+ o3 B8 c
            *b=tmp;: ~& O2 p  |. Y2 y* R
    }
    ) n) H$ G/ k2 W8 c+ ]; f- E. K& i' Q6 G& |
    ======================================================================/ D, E* X: F. [3 Y0 S4 z5 K
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    6 Z  s# ], K2 Y' _% t    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!' v: N" M* Q* A1 a/ y

    . W4 `+ {& E/ O* Y7 y! h( [; W- [4 Y4 h% v& }- [

    8 J1 i9 N: w4 l8 _4 T9 T. d
    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, 2025-8-22 09:01 , Processed in 0.614712 second(s), 50 queries .

    回顶部