首页 > 解决方案 > 拼接和移位函数在递归中没有按预期工作

问题描述

我正在编写我的第一行JS代码,现在我正在尝试做一个简单的递归函数。

我知道splice()shift()删除了他们提取的项目。

我在这里遇到了麻烦:

function sub (...par) { // It could take an arbitrary number of parameters

    if (par.length >= 2)
    {
        var val = par.shift();
        //val = par.splice(0,1);
        return val - sub(par);
    }
    else 
    {
        /*EDIT*/ //return par[0];
        return -par[0];
    }
}

现在如果我运行:sub (17,7)我正确地得到了10,但是如果我运行sub(17,7,3)而不是得到8我得到了NaN

感谢 Jonas Wilms 的帮助,这样修复:

function sub (...par) { // It could take an arbitrary number of parameters

    if (par.length >= 2)
    {
        var val = par.shift();
        //val = par.splice(0,1);
        return val - sub(...par);
    }
    else 
    {
        /*EDIT*/ //return par[0];
        return -par[0];
    }
}

标签: javascriptrecursion

解决方案


你必须传播递归调用:

  return val - sub(...par);

否则par被调用的内部sub将是一个包含数组的数组,并且对其进行减法将失败。

但是,如果您直接采用第一个参数,整个事情会更加优雅:

  function sub(head, ...rest) {
    if(!rest.length) return head;
    return head - sub(...rest);
  }

但是应该注意,您可能不会得到您期望的结果,因为您在左侧之前计算右侧,所以

  sub(1, 2, 3)

等于

 1 - (2 - 3)

那就是2。

我认为如果可以通过以下方式实现sub(1, 2, 3)平等会更清楚1 - 2 - 3

 function sub(...rest) {
   if(rest.length === 1) return rest[0];
   const last = rest.pop();
   return sub(...rest) - last;
 }

或者没有递归:

  const sub = (...args) => args.reduce((a, b) => a - b);

推荐阅读