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个元素的乘积时,运行流程是:
- 最外层n=3,需要先拿到
multiply(arr,2)的返回值(也就是前2个元素的乘积),再乘以第3个元素arr[2]=4 - 进入n=2的调用,需要先拿到
multiply(arr,1)的返回值(前1个元素的乘积),再乘以第2个元素arr[1]=3 - 进入n=1的调用,需要先拿到
multiply(arr,0)的返回值(0个元素的乘积,即基准值1),再乘以第1个元素arr[0]=2 - 递归触底返回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
相关产品推荐
相关产品推荐

