知道了 发表于 2015-4-16 14:28

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




/*
使用递归方法求全排列
*/

#include<stdio.h>

int sum=0;
int main(){
        int n,i;
        char *p;
        void perm(char *,int,int);

        scanf("%d",&n);
        p=new char;
        for(i=0;i<n;i++){
                getchar();
                scanf("%c",p+i);
        }

        perm(p,0,n-1);
        printf("==>%d",sum);

        return 0;
}

void perm(char *p,int s,int e){
        int i;
        void swap(char*,char*);
        
        if(s==e){
                printf("%s\n",p);
                sum++;
                return ;
        }
        else{
                for(i=s;i<=e;i++){
                        swap(p+s,p+i);
                        perm(p,s+1,e);
                        swap(p+s,p+i);
                }
        }
}

void swap(char *a,char *b){
        int tmp=*a;
        *a=*b;
        *b=tmp;
}

======================================================================
    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!



页: [1]
查看完整版本: 算法:求全排列的递归算法