为什么我的递归函数在没有通过逻辑测试的情况下执行递归(Javascript函数帮助)?
我正在执行一个简单的递归,我注意到保存递归的逻辑正在被调用,即使在为什么我的递归函数在没有通过逻辑测试的情况下执行递归(Javascript函数帮助)?,javascript,recursion,Javascript,Recursion,我正在执行一个简单的递归,我注意到保存递归的逻辑正在被调用,即使在return三元规则语句中有一个假参数 此小递归将执行以下操作: 将数组从最小到最大排序 当a小于100时减少 如果a大于100,则使用切片的数组调用该函数并增加vol 在这种情况下,如果调用nSVol(nSm2,0)的结果应该是4 我注意到它工作得很好,直到最后一次递归之后,arr是70,arr长度是1,vol是4。不知何故,在递归的这一点上,即使我声明当长度等于1返回vol+1,函数再次被调用,带有arr的最后一个快照,在这种
return
三元规则语句中有一个假参数
此小递归将执行以下操作:
将数组从最小到最大排序
当a
小于100时减少
如果a
大于100
,则使用切片的数组调用该函数并增加vol
在这种情况下,如果调用nSVol(nSm2,0)
的结果应该是4
我注意到它工作得很好,直到最后一次递归之后,arr
是70
,arr
长度是1
,vol
是4。不知何故,在递归的这一点上,即使我声明当长度
等于1返回vol+1
,函数再次被调用,带有arr
的最后一个快照,在这种情况下是[55,70]
,最后,vol
是它自身值的结果,加上arr
的值,结果是73
我做错了什么
const nSm2 = [20, 55, 13, 20, 55, 13, 70];
function nSVol(arr, vol) {
return arr.length === 1
? vol + 1
: arr
.sort((a, b) => a - b)
.reduce((a, b, i) =>
a + b < 100 ? a + b : nSVol(arr.slice(i), vol + 1)
);
}
const nSm2=[20,55,13,20,55,13,70];
函数nSVol(arr,vol){
返回arr.length==1
?第1卷
:arr
.sort((a,b)=>a-b)
.减少((a,b,i)=>
a+b<100?a+b:nSVol(arr.slice(i),vol+1)
);
}
您的代码的问题是reduce
在超过100后继续运行,这意味着您最终会进行大量不需要的重复计算。不要使用reduce
,只需使用循环(是的,递归函数中仍然可以有循环)来查找第一次通过100的时间。此外,您不需要每次都进行排序,因此您只需将递归部分放入辅助函数:
函数nSVolHelper(arr,vol){
设和=0;
for(设i=0;ia-b),0;
}
另一个相当干净的方法是以下更传统的递归版本:
const nSVol=(arr)=>{
常数重复=([x,…xs],总和,体积)=>
x==未定义
?卷
:总和+x<100
?重现(x,总和+x,体积)
:重现(x、x、vol+1)
返回循环(arr.sort((a,b)=>a-b),0,1)
}
常数nSm2=[20,55,13,20,55,13,70];
console.log(nSVol(nSm2))/=>4
非常感谢您的善意解释。为什么sum+=arr[i]
没有将数组值(包含在arr[i]
中的值)添加到sum
?我看到它正以一的方式递增sum
。我不明白。sum
不是vol
vol
增加1,但sum随数组元素的增加而增加。