我很难理解引用传递如何影响下面的递归函数。
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);
}
}
答案 0 :(得分:2)
对isMeasureable
的每次调用都会在作为参数传入的向量前面切出一个元素。传递给三个递归rest
调用时,isMeasurable
具有不同的内容 - 每次调用时,它会缩短一个元素。
不是物理修改矢量,而是将额外的参数传递给isMeasurable
- 以及开始工作的偏移量。进行递归调用时增加此偏移量。然后通过const引用传递weights
,不要复制任何副本。