保持递归计数

时间:2011-02-20 17:02:13

标签: 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();
}

3 个答案:

答案 0 :(得分:6)

使用static计数将不起作用,因为它不会被重置(并且如果你去多线程会导致问题)。

相反,如何:

int Permutation(/* params */)
{
    int count = 1;  // Count ourself

    for (whatever)
    {
        count += Permutation(whatever);  // Count cumulative sum from recursion
    }

    return count;
}

每次调用Permutation()都会返回在调用树中 下面调用的总调用次数。当我们放松时,来自子树的所有计数总和在一起,最终产生最终的返回值。

答案 1 :(得分:2)

int foo(int count,/*Other Params*/) {
/*Calucation*/
 if (!terminatingCondition) {
  foo(count++,/*Other Params*/);
 }
 logger.log("foo was called " + count + "times");
 return /*calcualtion*/;
}

答案 2 :(得分:0)

我只是想忽略你的实际算法目的来回答这个问题。两个静态应该移动到参数引用,或者你没有一个好的方法来重置它们的值。

void Permutations(vector<vector<int>> param, vector<vector<int>> &perm, vector<int> &iter, int &count, int index=0)
{
    ++count;
    // ...
}