为什么我的递归函数在没有通过逻辑测试的情况下执行递归(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随数组元素的增加而增加。