QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    3 X8 O; n0 q0 x7 z4 s1 n( [9 Y0 Z$ D- l+ u: d
    + S' a. Z1 P" b7 J3 G$ y
    /*7 a2 Y8 H9 E7 @/ y
    使用递归方法求全排列' x& _( Z  w+ W$ ^; n! ~$ c- \
    */8 h* }0 _0 E/ k+ t
    ! k  ?+ I/ C6 `, v
    #include<stdio.h># o- m; M2 |: z; s4 r/ {

    : U+ U! `( p: d" tint sum=0;. m1 S* ^4 h) D  w* {6 V+ U
    int main(){
    6 p4 C0 b9 Q; B& s8 b7 p+ w        int n,i;
    ) ]* D, z3 J+ V* T( W9 k- n        char *p;! L, N# `  h9 {# D( ^0 W! o
            void perm(char *,int,int);
    - [+ w( o7 U7 {; ~
    % r2 S7 K$ C4 D+ ]5 K* f        scanf("%d",&n);9 e1 t- n1 T+ P# o$ H( {
            p=new char[n];4 [6 X. v8 [, I( g& y
            for(i=0;i<n;i++){2 }& a# v+ ]# F" c
                    getchar();2 l: i% h; z" }0 ?
                    scanf("%c",p+i);2 D; U, T& ^2 O
            }
    ' R5 ?' D$ O* j6 _$ M7 I1 n. }5 A# s. J
            perm(p,0,n-1);
    9 X2 A' h. |. V# Z3 a2 z        printf("==>%d",sum);: Y1 _  L+ r. h" C% s: r

    5 `7 a, h) d5 T) R        return 0;
    . t/ O. j5 B1 t; Y5 w}
    # b6 ]5 b% v' F; |$ b$ h0 K8 S  L% [8 k* b* _% r$ n$ `
    void perm(char *p,int s,int e){
    8 A4 b4 F' ?# X/ U        int i;
    / Y4 }2 R  U2 m' w; a        void swap(char*,char*);
    ' F0 o4 ]- p. u$ t( j* T5 n) F( X        ! c; D) K' Y7 V: _. W/ [
            if(s==e){
    2 R. G" b$ i! V  c- x" k7 w9 N                printf("%s\n",p);
    + j& [, i* ~) v. i, y. R5 [! _                sum++;
    3 q- ^6 J3 i' Z& ?# k! w2 ?                return ;
    3 T" t7 u4 @1 W" `! P        }: S. T( j, Y) L& j. U
            else{3 P8 R' ]! A* a+ A7 U$ t- }) b
                    for(i=s;i<=e;i++){* B; n7 |) Q) f
                            swap(p+s,p+i);. V* B6 r9 ?' b3 N
                            perm(p,s+1,e);
    / a+ f5 m+ h0 @% r1 _                        swap(p+s,p+i);
    " d; j$ E  d% ?4 |- i8 k3 T0 V                }7 q! W0 C- A2 B# V; `! |$ n
            }
    ) C8 m8 s  I& R, f* f8 Q% `}$ x; x) n$ Z4 x$ _3 @8 Y

    . T* W; u& I# u  D/ X, _void swap(char *a,char *b){
    / ~0 r1 A5 w. z% E( l2 o6 c        int tmp=*a;- x3 R% i! w, l% L. Z, I2 G. U
            *a=*b;& ^' N8 M# p+ o: d: \4 z, l
            *b=tmp;
    2 {( W4 s* N4 w* S& i( ?}
    8 `( b+ A# M9 p% D5 ]( t. R5 w; B  L
    ======================================================================6 o3 q+ O  v' y7 |# S8 l. [% p
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。  m: x; G1 d8 U6 L5 I8 [2 n& a1 }
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    , R% X1 ]) d5 r  u5 A) p7 m. t8 q8 ^$ u& l+ P
    5 M, |- P( J4 X: z* R

    ! T) X) X$ I) r% w, `" 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, 2025-6-19 20:53 , Processed in 0.374325 second(s), 50 queries .

    回顶部