Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递归生成置换_C++_Algorithm_Recursion - Fatal编程技术网

C++ 递归生成置换

C++ 递归生成置换,c++,algorithm,recursion,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

我发现递归,除了像阶乘这样非常直截了当的递归,很难理解。如果我想打印字符串的所有排列,那么假设字符串长度为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
的阶乘的所有排列,比如
4
3
2
1
。我应该使用哪种算法?在C++库中有什么功能吗?< /P> 假设打印输出应如下所示:

acbd
bcad
abc
bac
ab
ba

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

对于阶乘,将问题定义为
F(n)
factorial of
n

  • 基本情况下,
    F(0)=1
  • 子问题模式,
    F(n)=n=n*(n-1)=n*F(n-1)
  • 对于置换,将
    p(E)
    定义为集合
    E
    的所有置换

  • 基本情况,
    P({})={{}
  • 子问题模式。考虑置换的过程,假设我选择了第一个元素<代码> x>代码>,然后得到一个子问题,<代码> p(E-X),然后对于P(E-X)中的每个<代码> P,和 x>代码>前面,我们从元素<代码> x>代码>中得到所有排列,迭代<代码> x>代码>您得到所有排列,又名代码> p(e)。
  • 在C++中,可以使用.< /P> 上述思想的示例代码如下所示:

    // generate permutation of {a[st], a[st+1], ..., a[ed]}
    void P(char a[], int st, int ed) {
        if (st > ed) { puts(a); return; } // nothing to generate
        for (int i=st; i<=ed; ++i) {
            swap(a[st], a[i]);            // enumerate first element
            P(a, st+1, ed);
            swap(a[st], a[i]);            // recover
        }
    }
    
    //生成{a[st],a[st+1],…,a[ed]}的置换
    无效P(字符a[],整数st,整数ed){
    if(st>ed){put(a);return;}//不生成任何内容
    
    对于(int i=st;i原始长度是5当然xd你尝试过什么吗?也许是一些代码?5的机械因子的下降解释是120…我想你是指长度小于或等于5的排列