使用此方法很容易能理解该递归算法
    全排列 - 图1

    1. #include<stdio.h>
    2. #include<string.h>
    3. void swap(char *a, char *b) {
    4. char tmp;
    5. tmp = *a;
    6. *a = *b;
    7. *b= tmp;
    8. }
    9. // 对str[]中sbegin-send范围内的元素进行全排列
    10. void permutation(char* str,int sbegin,int send) //全排列的非去重递归算法
    11. {
    12. int i;
    13. if(sbegin == send) //sbegin=send,即对一个元素进行全排列,直接输出
    14. {
    15. for( i = 0; i<=send; i++) //输出一个排列
    16. printf("%c", str[i]);
    17. printf("\n");
    18. }
    19. else
    20. {
    21. // str[sbegin]位置有可能是sbegin-send中的任意元素
    22. for( i = sbegin; i <= send; i++) //循环实现交换和sbegin + 1之后的全排列
    23. {
    24. swap(&str[i], &str[sbegin]); //把第i个和第sbegin进行交换
    25. permutation(str, sbegin + 1, send);
    26. swap(&str[i], &str[sbegin]); //【注1】交换回来
    27. }
    28. }
    29. }
    30. int main() {
    31. char tmp[50];
    32. scanf("%s", tmp);
    33. printf("全排列:\n");
    34. permutation(tmp, 0, strlen(tmp)-1);
    35. }