Javascript 拼接和移位函数在递归中未按预期工作

Javascript 拼接和移位函数在递归中未按预期工作,javascript,recursion,Javascript,Recursion,我正在写我的第一行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);

我正在写我的第一行
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];
    }
}

您必须在递归调用上展开:

  return val - sub(...par);
否则,被调用的
sub
内部的
par
将是一个包含数组的数组,对该数组进行减法运算将失败

但是,如果直接使用第一个参数,整个过程会更加优雅:

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

考虑这个即使使用零参数也返回正确值的总体实现

const sub=(a=0,b=0,…更多)=>
more.length==0
? a-b
:sub(a-b,…更多)
console.log(sub(17))//17
log(sub(17,7))//17-7=10
console.log(sub(17,7,3))/(17-7)-3=7
console.log(sub(17,7,3,2))/((17-7)-3)-2=5
console.log(sub(17,7,3,2,4))/((17-7)-3)-2)-4=1

console.log(sub())//0
谢谢,真是太棒了