C++ 维护递归计数
我试图计算递归置换函数中的调用数 我已经编写了一个函数,用所有的排列填充队列,但我似乎不知道如何保持准确的计数 最后,我希望函数返回由lbound和ubound参数指定的置换的子集,为此,我认为需要某种方法来保持内部计数 使用返回队列的大小将不起作用,因为我希望函数能够处理太大而无法保存在内存中的排列 对于这段代码,我希望计数返回为100C++ 维护递归计数,c++,recursion,permutation,C++,Recursion,Permutation,我试图计算递归置换函数中的调用数 我已经编写了一个函数,用所有的排列填充队列,但我似乎不知道如何保持准确的计数 最后,我希望函数返回由lbound和ubound参数指定的置换的子集,为此,我认为需要某种方法来保持内部计数 使用返回队列的大小将不起作用,因为我希望函数能够处理太大而无法保存在内存中的排列 对于这段代码,我希望计数返回为100 #include <vector> #include <iostream>; using namespace std; int&a
#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();
}
使用静态计数将不起作用,因为它永远不会被重置,如果您使用多线程,它将导致问题
相反,这个怎么样:
int Permutation(/* params */)
{
int count = 1; // Count ourself
for (whatever)
{
count += Permutation(whatever); // Count cumulative sum from recursion
}
return count;
}
对排列的每次调用都返回调用树中在其下方进行的调用总数。当我们展开时,来自子树的所有计数相加,最终生成最终的返回值。我只是试图通过忽略您的实际算法目的来回答这个问题。应该将这两个static移到参数引用中,否则您没有重置它们的值的好方法
int foo(int count,/*Other Params*/) {
/*Calucation*/
if (!terminatingCondition) {
foo(count++,/*Other Params*/);
}
logger.log("foo was called " + count + "times");
return /*calcualtion*/;
}
void Permutations(vector<vector<int>> param, vector<vector<int>> &perm, vector<int> &iter, int &count, int index=0)
{
++count;
// ...
}
比在签名中添加另一个参数要优雅得多。你甚至没有想到。+1你可以使静态工作,但不能与多个线程,在任何情况下,你应该使用堆栈,因为你说,这就是为什么我们发明了他们!