最后的组合是双重基本C ++

时间:2019-03-21 12:55:42

标签: c++ recursion cartesian-product

我想要一个返回字母X的所有可能组合的函数,这些组合必须为n长。我知道这已经做了一百万遍了,但是我试图理解递归。

我不明白的两件事:

一个。该函数将系列的每个最后一次迭代插入两次,因此,如果字母为“ AB”且长度为2,我会期望:

AA
AB
BA
BB

但是我得到了

AA
AB
AB
BA
BB
BB

和 2.函数如何需要外循环内的返回。如果我只删除外部循环并留下return,那么我会遇到细分错误。

在函数中,我将向量与我保持在一起,也可以将其置于全局范围内,但效果相同。我会快速构建可能的组合S并保持len en的深度:

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;

void combirec(vector<string> &A, char S[20], char *alphabet, int len, int depth)
{
    for (int i = 0; i < len; i++) {
        for (int c = 0; c < strlen(alphabet); c++) {
            S[depth] = alphabet[c];
            combirec(A, S, alphabet, len-1, depth+1);
            A.push_back(S);
        }
        return;
    }
}

int main()
{
    vector<string> A;
    char S[20];
    char alphabet[6] = "AB";
    int len = 2;
    S[len] = '\0';
    combirec(A, S, alphabet, len, 0);
    for (int i = 0 ; i < A.size(); i++)
        cout << A[i] << endl;
}

2 个答案:

答案 0 :(得分:1)

您的问题是同时具有循环和递归:

void combirec(vector<string> &A, char S[20], char *alphabet, int len, int depth)
{
    for (int i = 0; i < len; i++) {//<--LOOP HERE
        for (int c = 0; c < strlen(alphabet); c++) //{<--LOOP HERE
            S[depth] = alphabet[c];
            combirec(A, S, alphabet, len-1, depth+1);//<--RECURSIVE HERE
            A.push_back(S);
        }
        return;
    }
}

如果您不想递归,则可能最多需要一个循环。

有关类似问题,请参见以下答案:

Creating all possible k combinations of n items in C++

答案 1 :(得分:1)

一些有用的建议导致了一个解决方案,尽管为什么对我来说仍然如此。我永远不会自己想到这个。

void combirec(vector<string> &A, char S[20], char *alphabet, int len, int depth)
{
    if (len > 0)
        for (int c = 0; c < strlen(alphabet); c++) {
            S[depth] = alphabet[c];
            combirec(A, S, alphabet, len-1, depth+1);
        }
    else
        A.push_back(S);

}
相关问题