递归分治算法之全排列(C语言)

递归与分治算法之字符全排列

一、问题描述

设有数组char a[]={‘a’,’b’,’c’,’d’,’e’,’f’}; 设计一个程序来实现数组中所有的字符组成的有序序列输出。例如‘a’,‘b’组成的有序序列为‘ab’,’ba’即’a’,’b’的全排列序列为’ab’,’ba’.类似的‘abcdef’六个字符组成的全排列有序序列共有6!个即720个序列。

二、问题分析

从问题中我们不难想到。仅有个字符就有720种组合。如此小的基数却又如此庞大的输出结果。如果要按照条件来控制输出的话,可想那是一个多么庞大的工作。所以我们应该想到利用递归算法来简化程序。而递归算法的核心是找到问题的递归解。或者说问题的相似解。然后利用递归的边界条件以及递归解的表达式来产生递归算法以解决问题。

当我们仔细分析问题不难看出。由两个字符产生的全排列的结果是每个字符的全排列的组合。即’ab’全排列的结果是’a’全排列的结果和’b’全排列的结果的组合。而’abc’全排列的结果则可以看成是’a’全排列的结果’bc’全排列的结果的组合。’bc’有可以看成是’b’和’c’各自全排列的结果的组合。

这样问题的地归解就是。每个字符本身的全排列(就是字符本身)。

而各个全排列之间的组合则是通过各个全排列结果之间的前后交换来实现的。即当有n个字符的字符串按照原来的顺序递归求解完毕后。需要将第一个字符与其他的字符依次交换位置来重新递归求解。交换n-1次之后。问题求解完毕。

三、C语言算法实现

#include <stdio.h>

 

int n = 0;

 

  /**

     * 交换某两个字符

            perm(list, k + 1, m);

            swap(&list[k], &list[i]);//虽然还原了回来不过下次要交换

                                     //的变化

        }

    }

}

 

int main() {

    int number, i, j;

    printf(“How many char do you want to put in?\ncharnumber=”);

    scanf(“%d”, &number);

    char list[number];

    printf(“Now please input the %d chars one by one\n”, number);

    printf(“\n\tMake sure that there is nothing but your chars even space or entertype\n”);

    /*<span courier=”” new”;=”” mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:”courier=”” mso-bidi-font-family:”courier=”” new”;color:#3f7f5f;mso-font-kerning:0pt;”=”” style=”line-height: 22px; font-size: 10pt; font-family: 宋体;”>注意输入的字符之间不能有任何其他的字符包括空格和回车*/

    for (i = -1; i < number; i++) {

        list[i] = getchar();

    }

    perm(list, 0, number – 1);

    printf(“\n\tthere are total %d resultants\n”, n);

    return 0;

}

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/change_angle/article/details/50807608
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞