C语言字母排列组合的实现
曹玉坤
2011-6-21
目录
概述3
需求3
规律3
实现算法5
难点6
代码6
概述
本文档概述字母排列组合的实现算法和分析过程,着重强调在
解决问题前,对问题的思考方法;注重研究问题的思路。从问题需求
开始详述解决问题的过程。
需求
26
我们要解决的问题是,在 个字母中取出任意多个进行排列组
合并把他们的组合方式打印出来。并要求用递归的方式实现。
规律
从要求中可以看出,需要使用递归的方式来解决问题。这是对我
们很好的提示。大家知道递归时用在f(n)和f(n-1)之间有计算关系的,
也就是说通过对f(n-1)的计算处理就能够得到f(n)的结果。最终在n
等于某个具体的数值时,我们能确切的算出f(n)的值,也就是要给我
们一个基点。
通过以上分析,就明确了我们的需要做的工作:第一,我们要找
到f(n)和f(n-1)之间的规律;第二我们要找出那个基点,也就是能确
切给出f(n)值的点。
我们先来看看下面的字母排列:
a
ba ab
cba cab bca acb bac abc
dcba dcab dbca dacb dbac dabc cdba cdab …
… …
大家从上面的例子看出来规律没有?相信大家从上面的排列中
一眼就能看出各个数列直接的关系,那就是:新添字母总是按照顺序
a, b
插入到原有排列的之间。如第一列是 第二列就是新添字母 先添
a a
加到排列 的前面,然后再排列到 的后面,这样就形成了第二行的
baab c ba c
排列 。第三行排列如规律: 先排列到 的前面, 再排列到
ab c b a bca, c ab
的前面,下来 排列到 后 前形成 其次 排列到 的中间
acb c ba bac, c ab
形成 ;接着 又排到 后面,形成 然后 再排列到 后面
abc
形成 。这样我们就得到了第三行的字母排列。相信大家已经会按
规律排列第四行的字母排列了。
规律已经找到,那么我们选择几个字母作为基点呢?如上图排
列,我们可以轻松的罗列出来一个字母时的排列,两个字母时的排列,
三个字母时的排列,四个的时候,虽然我们也能根据规律将其罗列出
来,但已经比较麻烦了。那么我们的基点必然就是选择n 1,2,3 中的
一个了。到底哪一个,现在先不讲,看完后面的大家就明白了怎样选
取递归用的基点。
实现算法
上一节我们已经分析了递归用的f(n)和f(n-1)之间的规律。现在
我们看看递归中基点的选取。我们举个例子来说明,字母为a、b、c、
d 、e 、f 、g 、h 、i 、g….等等,首先看 f(1) a; f(2) ba, ab;
f(3) cba,cab,bca,acb,bac,abc。我们看看先哪个做基点比较好。
首先我们假定以f(1)为基点。f(1) char [1] {a}那么相对于f(2)应
该怎么算呢?因为数组必须初始化长度,所以这里我们用到malloc
动态申请存储空间。这样我们先计算要申请空间的大小。N 个不同字
母组成个数为Pn N!,总长度应为N*N!。f(2)的空间为2*1*2 4。应该
动态