递归函数内的计数

Counting inside a recursive function

本文关键字:递归函数      更新时间:2023-10-16
int countLatticePoints(std::vector<int> &point, const double &radius, const int &dimension) {
static int count = 0;    
for(int i = -(static_cast<int>(std::floor(radius))); i <= static_cast<int>(std::floor(radius)); i++) {
    point.push_back(i);
    if(point.size() == dimension){
        if(isPointWithinSphere(point, radius)) count++;
    }else countLatticePoints(point, radius, dimension);
    point.pop_back();
}
return count;
}

我有上面的递归函数,如果条件isPointWithinSphere( ... )为真,我想增加一些变量。我最初的方法是声明一个名为 count 的静态变量,以便它通过每个递归调用来维护计数。好的,当我第一次调用函数时,这countLatticePoints工作正常,但现在如果我再次调用该函数,它会添加到我第一次调用countLatticePoints时的前一个count值。我知道发生这种情况是由于静态限定符的行为方式。有什么方法可以在一次调用完成后将该count变量重置回 0,然后再调用第二个调用?我当然不想使用全局变量,在这种情况下还有其他方法可以工作吗?

您不需要任何静态变量或其他参数。这是你需要的。

int countLatticePoints(std::vector<int> &point, const double &radius, const int &dimension) {
    int count = 0;
    const int iRadius = std::floor(radius);
    for(int i = -iRadius; i <= iRadius; i++) {
        point.push_back(i);
        if(point.size() == dimension){
            if (isPointWithinSphere(point, radius))
                count++;
        } else
            count += countLatticePoints(point, radius, dimension);
        point.pop_back();
    }
    return count;
}

附带说明一下,您不需要传递 int 或 double 作为引用。

您可以使用帮助程序函数来完成所需的操作,如下所示:

void countLatticePoints(std::vector<int> &point, const double &radius, const int &dimension, int& count) {
    const int int_radius = static_cast<int>(std::floor(radius));
    for(int i = -int_radius; i <= int_radius; i++) {
        point.push_back(i);
        if(point.size() == dimension){
            if(isPointWithinSphere(point, radius)) count++;
        }else countLatticePoints(point, radius, dimension, count);
        point.pop_back();
    }
}
int countLatticePoints(std::vector<int> &point, const double &radius, const int &dimension) {
    int count = 0;    
    countLatticePoints(point, radius, dimension, count);
    return count;
}

传递计数作为参数;为其指定默认值 0,以便初始调用不必提供它。 这能满足您的需求吗?