【问题标题】:pass by reference recursion function通过引用递归函数
【发布时间】:2023-03-15 16:22:01
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 2018-06-09
      • 2018-03-07
      • 1970-01-01
      • 2010-11-16
      • 2011-05-02
      • 2012-10-10
      • 2019-11-11
      • 1970-01-01
      相关资源
      最近更新 更多