You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript递归求数组乘积为何需乘以arr[n-1]

递归数组乘积逻辑答疑

核心疑问:递归实现版本中,return multiply(arr, n - 1) * arr[n - 1];这行代码为什么必须乘以arr[n - 1]?
两个版本的函数目标完全一致:计算数组arr前n个元素的累计乘积,运行后会返回相同的正确结果。

非递归实现

function multiply(arr, n) {
    let product = 1;
    for (let i = 0; i < n; i++) {
      product *= arr[i];
    }
    return product;
  }

非递归逻辑非常直观:从索引0的第一个元素开始,遍历到索引n-1的第n个元素,挨个把元素乘到初始值1上,最终得到累计乘积。

递归实现逻辑

function multiply(arr, n) {
    if (n <= 0) {
      return 1;
    } else {
      return multiply(arr, n - 1) * arr[n - 1];
    }
  }

递归的核心是把大问题拆成同结构的小问题求解:

  • 要算「前n个元素的乘积」,天然可以拆成两部分相乘:前n-1个元素的乘积、第n个元素本身的值
  • 数组下标从0开始计数,第n个元素对应的索引就是n-1,也就是代码里的arr[n-1]
  • 当n缩小到0时,说明没有剩余元素需要参与计算,乘积的基准值为1,直接返回即可终止递归。

拿实际调用举例,执行multiply([2,3,4], 3)计算前3个元素的乘积时,运行流程是:

  1. 最外层n=3,需要先拿到multiply(arr,2)的返回值(也就是前2个元素的乘积),再乘以第3个元素arr[2]=4
  2. 进入n=2的调用,需要先拿到multiply(arr,1)的返回值(前1个元素的乘积),再乘以第2个元素arr[1]=3
  3. 进入n=1的调用,需要先拿到multiply(arr,0)的返回值(0个元素的乘积,即基准值1),再乘以第1个元素arr[0]=2
  4. 递归触底返回1,之后逐层回溯计算:
    • n=1层返回结果:1 * 2 = 2
    • n=2层返回结果:2 * 3 = 6
    • n=3层返回结果:6 * 4 = 24

最终得到的24就是234的正确结果,和非递归版本输出一致。
如果删掉* arr[n-1]这段逻辑,每一层递归只会不断调用参数n更小的自身,最后直接返回基准值1,全程没有把数组里的任何元素纳入乘积计算,结果会完全错误。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:51:31