递归以生成排列

时间:2016-06-11 14:30:15

标签: c++ algorithm recursion

我发现递归,除了非常直接的因素,如阶乘,很难理解。如果我想打印字符串的所有排列,那么可以说字符串长度为5,如"abcde",长度7的排列应为

abced
abdce
abdec
abecd
abedc
acbde
acbed
acdbe
acdeb
acebd
acedb
adbce
adbec
adcbe
adceb
adebc
adecb
aebcd
aebdc
aecbd
aecdb
aedbc
aedcb
bacde
baced
badce
badec
baecd
baedc
bcade
bcaed
...

如果我想要递归来计算5的因子的所有排列,例如4321。我应该使用哪种算法? C ++库中是否有任何函数用于此?

假设打印输出应如下所示:

acbd
bcad
abc
bac
ab
ba

1 个答案:

答案 0 :(得分:4)

使用递归算法,非常像mathematical induction。首先,您需要处理基本情况,然后找到子问题模式。

对于阶乘,请将问题定义为F(n)的{​​{1}}阶乘。

  1. 基本情况,n
  2. 子问题模式,F(0)=1
  3. 对于排列,请将F(n)=n!=n*(n-1)!=n*F(n-1)定义为集合P(E)的所有排列。

    1. 基本情况,E
    2. 子问题模式。考虑排列过程,假设我选择了第一个元素P({}) = {{}},然后我们得到了一个子问题x,然后是每个P(E-x)p in P(E-x)到在前面,我们得到了从元素x开始的所有排列,迭代x你获得了所有的排列,即x
    3. 在C ++中,您可以使用next_permutation

      以上思想的示例代码如下:

      P(E)

      http://ideone.com/zbawY2上查看。