通过引用传递递归函数

pass by reference recursion function

本文关键字:递归函数 引用      更新时间:2023-10-16

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

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。如果没有向量权重的引用语法,该函数可以正常工作。然而,当我通过引用传递时,函数返回错误的结果。

我知道这个问题与引用传递有关,但是有人能精确地指出引用传递导致这个问题的确切位置吗?

//编辑:这段代码似乎甚至可以通过引用传递。唯一的变化是先给vector rest赋值,然后再修改vector rest。

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);
    }
}

每次调用isMeasureable都从作为参数传入的vector的前面取出一个元素。当rest被传递给三个递归的isMeasurable调用时,它有不同的内容-每次调用它都会缩短一个元素。

不是物理地修改向量,而是传递一个额外的参数给isMeasurable -和开始工作的偏移量。在进行递归调用时增加此偏移量。然后通过const引用传递weights,并且不要复制。