每个最后的组合都是双基本C
Every last combination is double basic C++
我想要一个函数,该函数返回字母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);
}
相关文章:
- 根中的组合
- 更改 C++ 中的组合分类变量
- 顶部带有搜索框的组合框
- 计算数组重复次数的组合的有效算法,加起来达到给定的总和
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 括号可能的组合模式
- Freeopcua C++ 客户端和 Python Opcua 的组合会在 getChild() 上抛出错误
- 动态填充的组合框不显示文本,列表未定义
- 将文件内容存储到unordered_map仅存储最后的项目和值
- ID2D1PathGeometry 和 ID2D1DeviceContext 的组合
- 处理将 AoS 转换为 SoA 时的组合爆炸
- 可视化 如何将 CString 值列表添加到 MFC C++ 中的组合框中?
- 从向量的向量中删除向量的组合
- 如何得到几个子向量的组合
- 我怎么知道我最后的指示
- Win32Api C++中的组合框
- 2个模板构造函数的组合构建与变异模板.如何
- 从左到右打印字符串的组合(不是排列)c++
- 为什么查找 + 插入的组合比单个插入语句工作得更快
- 每个最后的组合都是双基本C