Python与JS递归函数的差异及JS递归求和代码错误排查
JS递归求和错误分析与Python/JS实现差异
你的JS代码错误点
- 递归传参完全错误:
sum函数定义需要两个参数(数组ars和索引i),但递归调用时写的是sum(ars[1])——ars[1]取的是数组的第二个元素(第一次调用时是5),不是剩余元素组成的子数组;同时未传入第二个参数i,此时i为undefined。 - 终止条件逻辑失效:当
ars是数字(比如5)时,ars.length为undefined,和undefined的i比较会返回true,直接返回0。因此第一次调用sum(arr, 0)会计算6 + sum(5),而sum(5)返回0,最终结果就是6。
Python与JS的递归实现差异
- Python版本核心逻辑:基于数组切片实现递归。
array[1:]会返回一个新数组,包含原数组从第二个元素到末尾的所有元素;终止条件判断数组是否为空,为空则返回0。每次递归处理的都是更短的子数组,逻辑直接贴合“拆分问题”的递归思路。 - 你的JS函数初始设计:打算用索引遍历的方式(通过
i标记当前遍历位置),但递归时偏离了这个设计——既没传递正确的索引值,也没正确生成子数组(JS中要实现类似Python的切片效果,需用ars.slice(1),而非ars[1])。
修正后的JS代码
方式1:模仿Python的切片逻辑
let arr = [6, 5, 3, 1, 1, 1, 1]; function sum(array) { if (array.length === 0) { return 0; } return array[0] + sum(array.slice(1)); } console.log(sum(arr)); // 输出18
方式2:沿用索引遍历的初始设计
let arr = [6, 5, 3, 1, 1, 1, 1]; function sum(ars, i) { if (ars.length === i) { return 0; } return ars[i] + sum(ars, i + 1); } console.log(sum(arr, 0)); // 输出18
内容的提问来源于stack exchange,提问作者elRa
相关产品推荐
相关产品推荐

