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
谢谢,真是太棒了