通过引用递归函数传递

时间:2014-08-11 22:04:50

标签: c++ recursion pass-by-reference

我很难理解引用传递如何影响下面的递归函数。

bool isMeasureable(int target, vector<int>& weight){
    if (weight.empty()) {
       return target==0;
    }else{
       int value = weight.front();
       weight.erase(weight.begin());
       vector<int> rest=weight;

       return isMeasureable(target, rest)
       || isMeasureable(target-value, rest)
       || isMeasureable(target+value, rest);
   }
}

此功能基本上检查是否可以使用给定的权重来测量金额。举个例子, 如果向量权重包含1和3,则如果目标是2(作为3 - 1 = 2)或4(作为1 + 3 = 4),则函数返回true。 如果没有向量权重的引用语法,该函数可以正常工作。但是,当我通过引用传递时,该函数返回错误的结果。

我知道这个问题与传递引用有关,但有人可以确定引用传递导致此问题的确切位置吗?

//编辑:这个代码似乎甚至可以通过引用传递。唯一的变化是首先进行向量静止的赋值,然后修改向量静止。

bool isMeasureable(int target, vector<int> & weight){
    if (weight.empty()) {
        return target==0;
    }else{
        int value = weight.front();
        vector<int> rest=weight; // change made
        rest.erase(rest.begin()); //change made

       return isMeasureable(target, rest)
       || isMeasureable(target-value, rest)
       || isMeasureable(target+value, rest);
    }
}

1 个答案:

答案 0 :(得分:2)

isMeasureable的每次调用都会在作为参数传入的向量前面切出一个元素。传递给三个递归rest调用时,isMeasurable具有不同的内容 - 每次调用时,它会缩短一个元素。

不是物理修改矢量,而是将额外的参数传递给isMeasurable - 以及开始工作的偏移量。进行递归调用时增加此偏移量。然后通过const引用传递weights,不要复制任何副本。

相关问题