全排列算法递归实现(Permutations)

来源:互联网 发布:app数据分析网站 编辑:程序博客网 时间:2024/04/26 23:46

题目解释

全排列(Permutations),对输入的字符排列出所有可能的组合。例如,输入“123”,输出:

123
132
213
231
321
312

题目思路

输入一个字符,直接输出就好;输入两个字符,轮流先输出其中一个字符再输出另一个;输入三个字符,轮流输出其中两个字符再输出另外一个字符;……

由此可以发现,当n > 1时,我们输入n个字符的时候,可以轮流输出其中n-1个字符再输出剩下的那个字符,也就是n个字符的全排列是建立在n-1个字符全排列的基础上。

输入字符数 输入的字符 输出的情况 1 1 1(直接输出) 2 1,2 {1位数字} + 1/2 3 1,2,3 {2位数字} + 1/2/3 4 1,2,3,4 {3位数字} + 1/2/3/4

显然,选择递归实现是最省心实惠的好办法。

具体代码

void swap(char *a, char *b) {    int t = *a;    *a = *b;    *b = t;}void permutation(char *a, int first, int last) {    if (first == last) {        // 一位数字,直接输出        for (int i = 0; i <= last; i++) {            printf("%c", a[i]);        }        putchar('\n');    }    else {        // 从头遍历所有的字符        for (int i = first; i <= last; i++) {            // 交换成为第一个字符            swap(&a[i], &a[first]);            permutation(a, first + 1, last);            swap(&a[i], &a[first]);        }    }}

测试代码

#include <stdio.h>void test() {    printf("---test1---\n");    char str1[] = "1";    permutation(str1, 0, 0);    printf("---test2---\n");    char str2[] = "12";    permutation(str2, 0, 1);    printf("---test3---\n");    char str3[] = "123";    permutation(str3, 0, 2);    printf("---test4---\n");    char str4[] = "1234";    permutation(str4, 0, 3);    printf("---test5---\n");    char str5[] = "1234567";    permutation(str5, 0, 6);    printf("Done!\n");}int main() {    test();}

本文参考自博客:全排列算法及实现

原创粉丝点击