用C语言实现字符排列

koiding 发布于 2014/11/04 18:51
阅读 129
收藏 0

有一段代码看不懂,有木有大神能给解释一下

这段代码是关于递归实现字符的排列问题

#include <stdio.h>
#include <string.h>
char    w[20]={'\0'};
void perm(int n, char *s) {
    char s1[20]={'\0'};
    int i=0;
    if (n < 1) {
        printf("%s\n",w);
    } else {
        strcpy(s1,s);
        for (i = 0; *(s1 + i); i++) {
            *(w + n - 1) = *(s1 + i);
            *(s1 + i) = *s1;
            *s1 = *(w + n - 1);
            perm(n-1, s1+1);
        }
    }
    return;
}

int main(){
    char s[]="abc";
    perm(3,s);
    return 0;
}



加载中
0
h
hao5ang

这种问题一般要问下老师同学.在网上一般没有像我这样,不闲但很蛋疼的人解答.

排列组合问题.其主要思想是第一个位置确定之后,排列组合后面位置的.再把第二个位置确定了,继续排列组合后面位置.以此类推.

else后面的那个循环:

for (i = 0; *(s1 + i); i++) {
            *(w + n - 1) = *(s1 + i);
            *(s1 + i) = *s1;
            *s1 = *(w + n - 1);
            perm(n-1, s1+1);
        }



其实就是依次把当前位置(位置0)和后面位置互换.换一次(确定了当前位置),就调用方法去排列组合后面( s1+1 )的位置.后面也是同样,至于那个w数组,是用来存放结果的,倒着放的.

最后其实没必要每次都复制一个s1,也没必要有w,只需要在调用perm方法之后,把交换的字符再交换回来就行了.

koiding
koiding
大恩不言谢:-P
0
大连馋师
大连馋师
楼上好人一枚
返回顶部
顶部