getFirstHalf递归函数返回结果不符合预期问题求助
递归函数未返回最终结果的问题排查
问题分析
你的代码核心问题在于递归调用时未传递返回值:当你在if分支里调用getFirstHalf(firstHalf)时,只是执行了这个递归函数,但没有把递归得到的最终结果(长度为1的数组)赋值给当前层的变量,也没有直接返回这个递归结果。因此当前函数执行到最后,依然返回的是自己计算的那一层的前半部分,而非递归到最底层的结果。
比如传入[1,2,3,4,5,6,7,8]时:
- 第一次调用生成
[1,2,3,4],因为长度不是1,调用递归 - 第二次调用生成
[1,2],长度不是1,继续调用递归 - 第三次调用生成
[1],长度为1,返回[1] - 但第二次调用并没有接收这个返回值,依然返回自己生成的
[1,2] - 第一次调用同样没有接收返回值,最终返回
[1,2,3,4]
修正代码
只需在递归调用时,将返回值传递回上层即可,有两种写法:
写法一:直接返回递归结果
const getFirstHalf = function (array) { const firstHalf = []; for (let i = 0; i < Math.trunc(array.length / 2); i++) { firstHalf.push(array[i]); } if (firstHalf.length !== 1) { // 直接返回递归调用的结果,替换当前层的返回值 return getFirstHalf(firstHalf); } return firstHalf; };
写法二:更新变量后返回
const getFirstHalf = function (array) { let firstHalf = []; for (let i = 0; i < Math.trunc(array.length / 2); i++) { firstHalf.push(array[i]); } if (firstHalf.length !== 1) { // 将当前变量替换为递归后的结果 firstHalf = getFirstHalf(firstHalf); } return firstHalf; };
代码优化(可选)
可以用数组的slice方法简化前半部分的生成,替代循环,让代码更简洁:
const getFirstHalf = function (array) { const halfLength = Math.trunc(array.length / 2); const firstHalf = array.slice(0, halfLength); return firstHalf.length === 1 ? firstHalf : getFirstHalf(firstHalf); };
内容的提问来源于stack exchange,提问作者radman
相关产品推荐
相关产品推荐

