dar*_*een 0 c++ recursion permutation
我正在尝试计算递归排列函数中的调用次数.
我编写了一个用所有排列填充队列的函数,但我似乎无法弄清楚如何保持准确的计数.
最终我希望函数返回lbound和ubound参数指定的permuatations的子集,并且这样做我认为我需要保留一个内部计数.
使用返回队列的大小将不起作用,因为我希望该函数能够处理太大而无法保存在内存中的排列.
对于此代码,我希望将计数返回为100.
#include <vector>
#include <iostream>;
using namespace std;
int& Permutations(vector<vector<int>> param, vector<vector<int>> &perm, int index=0)
{
static vector<int> iter;
static int count = 0;
if (index == param.size())
{
perm.push_back(iter); // add permutation to queue
count++;
return count;
}
for (int i=param[index][0]; i<=param[index][1]; i+=param[index][2])
{
if (iter.size() > index) iter[index] = i;
else iter.push_back(i);
Permutations(param, perm, index+1); // recursive function
}
}
void main()
{
vector<vector<int>> params; // vector of parameter vectors
vector<int> param1, param2;
int arr1[3] = {0,9,1}; // range for each parameter vector
int arr2[3] = {0,9,1}; // specified as lbound, ubound, step
param1.insert(param1.end(),arr1,arr1+3);
param2.insert(param2.end(),arr2,arr2+3);
params.push_back(param1);
params.push_back(param2);
vector<vector<int>> queue; // queue of generated permutations
int permcount = Permutations(params,queue);
cout << "the permutation count is " << permcount << endl;
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
使用static计数将不起作用,因为它不会被重置(并且如果你去多线程会导致问题).
相反,这个怎么样:
int Permutation(/* params */)
{
int count = 1; // Count ourself
for (whatever)
{
count += Permutation(whatever); // Count cumulative sum from recursion
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
每次调用都会Permutation()返回在调用树中调用它下面的调用总数.当我们放松时,来自子树的所有计数总和在一起,最终产生最终的返回值.
| 归档时间: |
|
| 查看次数: |
4324 次 |
| 最近记录: |