用c语言实现字母排列组合,C语言字母排列组合的实现.pdf

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。应该

动态

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值