QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1525|回复: 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 @. q% g5 @/ v6 k6 v& ?$ W4 L$ _- _( s. D

    7 R, @* M/ A! j0 H/ y/** Z5 Q) o3 y! y7 M/ \* M9 P
    使用递归方法求全排列
    9 l2 ]: g' h8 U+ r3 l$ n$ ^*/5 Q3 v! r" M( V/ |6 }' E7 U

    : `' h* ]8 J' R0 R0 h3 P#include<stdio.h>
    0 K6 O0 I! S& X: V2 Y$ S7 D$ s8 Z% u
    int sum=0;% K& E* J0 b9 p( |6 Z4 \  i
    int main(){5 R+ L* l: \. ~. U4 ~9 C
            int n,i;& t( r+ W' W0 c' O! _5 A
            char *p;  i& |' g* V' y7 L
            void perm(char *,int,int);" Z2 r& f% b# T

    7 L) Z- o1 w% x. S  K9 ^+ j* _        scanf("%d",&n);
    1 ?, G- I7 b% Q8 \% u3 Z, u! I        p=new char[n];8 ^+ ?% ^- e+ [9 m
            for(i=0;i<n;i++){
    8 i* Z; o; O8 m' O. ]                getchar();
    ( |& T7 T) R- w8 X/ K% ?) ]+ K                scanf("%c",p+i);
    0 `2 P5 W  d6 E% p9 w2 @        }0 r% J% P1 z& A; H, b/ ^+ U

    , i% n% I" ^. |: P6 P        perm(p,0,n-1);2 Z( b4 Y7 A- q& @9 X
            printf("==>%d",sum);
    2 T5 w5 {7 }$ H' o$ F3 u- @8 z! L+ r0 g2 q( S* m6 T, [
            return 0;7 V1 b+ t4 o8 J1 w) a, f$ `, A
    }
    2 w  |5 t, T, X8 ^+ R6 q
    7 o. G3 |0 S/ r* kvoid perm(char *p,int s,int e){7 X0 E2 D( k8 l" f! p: X( ^, N* f
            int i;0 R  O( |+ U$ }- o
            void swap(char*,char*);) D5 C# x1 }* L
            
    4 _. S- j" k" u0 h        if(s==e){
    ! m, _" t0 N7 Y$ r, p. C, J                printf("%s\n",p);
    2 G& I$ |* Y' L; o                sum++;% S  J4 }% n0 H4 N
                    return ;8 h) a: X9 s. R. s
            }
    4 t" K# z( u2 Z1 ?7 ^2 b0 |- j        else{
    - ^( v; C. }3 p% @0 x4 G9 |                for(i=s;i<=e;i++){
    ' G& q+ Q. F6 t( f$ q                        swap(p+s,p+i);
    0 I% A5 T# V) y; q( B                        perm(p,s+1,e);' }0 G/ A1 A( c; O! e$ h
                            swap(p+s,p+i);
    4 d$ t. l0 @% _                }& S7 t' H) w7 g: p$ x* q; G
            }
    * \0 |5 x  \: C}
    " h' E7 E$ l" \: U% f; S3 q  U+ Y' p" q0 i8 x# ?5 X0 m3 ]
    void swap(char *a,char *b){. o9 J) v8 R3 y* J  ]# l
            int tmp=*a;3 ~) d% }( w5 Q0 C
            *a=*b;
    $ X0 C2 o# D4 L4 k" u        *b=tmp;) m$ k7 k" H. K
    }& m: B5 T$ W- w' m1 }6 z

      M2 }* S) r! t$ m======================================================================) z- e/ `  S- I
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    & \1 F# R0 m+ O( \9 G6 {( Q  ^    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!# |$ c* A0 N& V; c
    4 Q( d% b$ ?: j$ G, a# _
    & m8 r2 ~, Z4 P
    . S: W$ x: S0 `& x- o
    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-19 06:50 , Processed in 1.069867 second(s), 50 queries .

    回顶部