c++中生成排列中的递归问题
Recurssion issue in generating permutation in c++
我在c++中有两个n,我想以这样的方式生成这些向量中数字的排列:对于第一个向量的每一个排列,我都有所有其他向量的所有排列。假设我有两个向量是29另一个向量是56。那么我的结果应该是…
- 2 9 5 6
- 2 9 5
- 9 2 5 6
- 9 2 5
表示我得到的排列总数将是总次数=(第一个向量的排列次数乘以第二个向量的排列次数乘以第三个向量的排列次数,以此类推)
我写了下面的代码,我被击中到递归堆栈…对于2个大小为2的向量,它实际上打印了6次。
mySwap(int *x, int *y){
int temp;
temp = *x;
*x = *y;
*y = temp;
}
交换两个int元素
void myPerm(vector<vector<int>> myItems, int start, int end,int vectorIndex){
int j;
if(start == end){
for(int k = vectorIndex +1; k < items.size(); ++k){
myPerm(myItems, 0, myItems[k].size()-1,k);
}
for(int z = 0; z < myItems.size(); ++z){
for(int l = 0; l < myItems[z].size(); ++z){
std::cout << myItems[z][l];
}
}
}
else{
for(int j = start; j <= end; j++){
mySwap(&myItems[vectorIndex][start],&myItems[vectorIndex][j]);
myPerm(myItems,start + 1, end,vectorIndex);
mySwap(&myItems[vectorIndex][start],&myItems[vectorIndex][j]);
}
}
}
上面的代码递归地生成排列…
int main(){
vector<vector<int>> myItems;
int k = 0;
for(int i =0; i < 2; ++i){
myItems.push_back(vector<int>);
}
for(int j =0; j < 2; ++j){
myItems[i].push_back(k++);
}
myPerm(items,0,items[0].size()-1,0);
return;
}
my main function.
请给我一些提示或解决这个问题,因为上面的代码打印了六个原本应该是4次的排列。
谢谢
考虑到这不是作业,您可以简单地使用stl算法next_permutation而不是您所拥有的。
这是示例输入的代码。
int main()
{
std::vector<int> v1 , v2 , v3;
v1.push_back( 2 );
v1.push_back( 9 );
v2.push_back( 5 );
v2.push_back( 6 );
std::sort( v1.begin() , v1.end() );
std::sort( v2.begin() , v2.end() );
do
{
v3 = v2;
do
{
std::for_each( v1.begin() , v1.end() , [](int x) { std::cout << x << " ";} );
std::for_each( v3.begin() , v3.end() , [](int x) { std::cout << x << " ";} );
std::cout << std::endl;
}
while ( std::next_permutation(v3.begin() , v3.end() ) );
}
while ( std::next_permutation(v1.begin() , v1.end() ) );
return 0;
}
对于两个向量…我相信你可以进一步概括。
感谢所有关于STL函数next_permutation的想法。我不知道这件事。
我能写出我想要它正确的代码…
我的代码
void perm(std::vector<std::vector <int>> &items, int level){
if(level == 0){
for (int i = 0; i < items.size(); i++)
for (int j = 0; j < items[i].size(); j++)
std::cout << items[i][j];
std::cout<<std::endl;
while(next_permutation(items[level].begin(), items[level].end())){
for (int i = 0; i < items.size(); i++)
for (int j = 0; j < items[i].size(); j++)
std::cout << items[i][j];
std::cout<<std::endl;
}
}
else{
if(level > 0)
perm(items,level-1);
while(next_permutation(items[level].begin(), items[level].end())){
if(level > 0)
perm(items,level-1);
}
}
}
对于这个问题,使用next_permutation
可以完全省略递归。下面是一些未经测试的代码,它们被认为更优雅:
void myPerm(std::vector<std::vector<int>>& myItems)
{
for (int i = 0; i < myItems.size(); i++)
std::sort(myItems[i].begin(), myItems[i].end());
int level;
do
{
printAll(myItems);
level = myItems.size() - 1;
while (!next_permutation(myItems[level].begin(), myItems[level].end()))
level--;
}
while (level >= 0);
}
next_permutation
的优点是,当它"包裹"给定的集合时返回false,因此该集合已排序并准备好进行下一轮排列。
相关文章:
- 到连接组件算法的问题(递归)
- 需要为 C++ 中的以下问题设计递归算法
- 棘手的按值传递和按引用递归问题传递
- C++删除/(递归)对象销毁问题
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 变分模板递归构造函数问题
- 跟踪递归函数时出现问题
- 我遇到了有关递归的堆栈问题
- 这个简单的 C++ 递归函数来反转字符串有什么问题?
- 优化递归问题以计算超级数字
- 红黑树插入 - 递归问题 - C++
- 递归问题(2D正交)
- 遍历目录递归问题
- 数组的C++最大值使用递归问题
- 卡拉苏巴乘法,递归问题
- c++中生成排列中的递归问题
- c++爬楼梯递归问题
- 递归问题帮助c++
- 错误C2064: term不计算为一个带有1个参数的函数和递归问题
- C++链表递归问题