QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1676|回复: 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 |- y* n& V5 c/ A- x1 l  R8 z. o7 d5 b, i

    " Z7 j/ P7 X. F* |, X% Z* b4 s( l; `$ i# d# @6 ^  f
    /*9 F: V- D/ t8 c4 b1 a" c
    使用递归方法求全排列
    , b& T8 b# S4 C8 b5 J*/
    / Q0 g# n$ ]- A4 c0 M
    & x( a# Y( m6 j1 `$ o( U; u9 S#include<stdio.h>! H/ `, f) X9 ?/ A/ Q
    % t$ Z2 _0 J! O6 g+ Y" g) U
    int sum=0;
    ( S/ r, t7 x/ d6 ~) i) fint main(){4 b. y, W4 C- ?; _% O$ n* w
            int n,i;9 e; w7 Q0 j# T+ h$ W0 c
            char *p;
    1 n: h* V+ Z7 @- k8 W- V0 p        void perm(char *,int,int);6 P2 D& N& o9 C

    ' n, u$ ^* l0 @/ y! }7 M) e, ]' e1 v        scanf("%d",&n);
    0 |; d( Y9 k( n. Y6 n/ Z6 q        p=new char[n];1 v% i  Q' h2 I: @) t' O
            for(i=0;i<n;i++){
    6 }: ]1 \/ @1 v                getchar();
    $ K1 \. Q/ `& K3 [- d5 l                scanf("%c",p+i);
    ! @. l# T" F( w# ]$ w3 @3 c        }' Q* ~4 _0 [/ j% q" s0 r  Y; Z0 a
    ' z7 w5 o/ I$ _* d) B( Q% J
            perm(p,0,n-1);
    ; O. [5 H, _" }$ [$ d        printf("==>%d",sum);
    0 M7 O$ b- F) W' O* j& b; |
      z% Z  J2 {& U0 `5 W, q! f        return 0;
    ; J; A. [  V+ Z5 C' H}; D- V! _0 G2 `5 G: [$ A# K5 H, g

    & V& F: u) m' F: H  h6 o1 ]$ G7 {. Hvoid perm(char *p,int s,int e){# Z  I, Z! p  |/ c  S* e; J9 ^
            int i;
    ! M4 x3 M- v1 P0 P; q, L        void swap(char*,char*);, W7 d$ N2 ?& x; j* s2 z' h
            ( R" S. H9 W" U! g5 {
            if(s==e){
    $ H& O; D9 c( v2 Z* X8 L" K1 T                printf("%s\n",p);
    - K- i  `  F, X1 @* C                sum++;1 Y  g! H2 N; Q2 R3 ]& ^2 D
                    return ;
    ; d$ ~0 ^4 d) a0 |, v        }
    ! C! G0 d, H9 Z/ Q: O1 h) E" H8 S8 e        else{
    3 T: X; ?+ w% w4 ^% c                for(i=s;i<=e;i++){- C, y/ R, {5 y' e# e
                            swap(p+s,p+i);
    & W1 w& m! O6 p& X! e2 S5 I                        perm(p,s+1,e);
    ' h, o. [+ s, ?                        swap(p+s,p+i);1 X4 |4 w! F* I6 H6 \
                    }
    3 V3 A2 \3 Q$ E        }
    1 B+ [2 d$ [, Y; K! W0 @7 g}
    $ b& s( R+ a6 k* j, x# b; E+ o
    9 h: ~& c0 g, ?7 r! W; T& U8 E& x. Fvoid swap(char *a,char *b){
    2 ~" T# D, R/ Y! v0 E& O3 J        int tmp=*a;
    " Z, j6 Z/ Y7 W$ Q/ o/ u        *a=*b;$ w. u& I- A! P- g; G0 h2 a
            *b=tmp;; c! P+ t. v/ R( D0 U( i
    }
    / E( q6 `1 h# J1 P* N) u6 m3 ~+ U6 L7 T0 ~+ }
    ======================================================================$ m0 r% {  y# P$ T0 u9 E1 i
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    $ B1 Q1 o9 A  g! `    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    . X& _6 O( K6 u) f. R
    7 y' V% P, O" v3 z; E, p3 x0 B  ^: ~0 v8 a$ H! c
    ! X6 P% Y* U" k0 K# R
    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-16 08:30 , Processed in 0.414048 second(s), 51 queries .

    回顶部