每个最后的组合都是双基本C

Every last combination is double basic C++

本文关键字:最后的 组合      更新时间:2023-10-16

我想要一个函数,该函数返回字母x的所有可能组合,组合必须长。我知道这是之前已经完成了一百万次,但我试图了解递归。

我不明白的两件事:

一个。该函数插入了两次系列的最后一次迭代,因此,如果字母为" ab"并且长度为2,我期望:

AA
AB
BA
BB

但我得到:

AA
AB
AB
BA
BB
BB

和2.该功能如何需要外循环内的返回。如果我只是删除外循环并离开返回,则会得到分段故障。

在功能中,我将向量保留在我身上,我也可以将其放在全球范围中,但是我有相同的效果。我可以随时建立可能的组合,并保持深度:

#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] = '';
    combirec(A, S, alphabet, len, 0);
    for (int i = 0 ; i < A.size(); i++)
        cout << A[i] << endl;
}

您的问题既有循环又有递归:

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;
    }
}

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

有关一个类似问题,请参见此答案:

在C 中创建N项目的所有可能的K组合

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

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);
}