数组折叠递归函数返回undefined但console.log正常的问题求助
数组折叠算法问题排查
问题背景
我正在完成一道数组折叠的算法题,目标是将数组自身“折叠”指定次数,规则详情如下:
- 若数组元素个数为奇数,保留中间元素;若为偶数,折叠点位于中间元素之间,对应位置元素按规则相加
- 数组仅包含数字且不为空,参数
runs为大于0的正整数,表示折叠次数 - 单元素数组折叠后保持不变
实现代码
function foldArray(array, runs) { if (array.length === 1) { return array; } runs--; let middle = Math.floor(array.length / 2); let firstHalf = array.slice(0, middle).reverse(); let secondHalf = array.slice(middle); let isOdd = firstHalf.length !== secondHalf.length; let result = []; for (let i = 0; i < secondHalf.length; i++) { let out; if (isOdd) { if (i === 0) { result.push(secondHalf[i]); continue; } out = secondHalf[i] + firstHalf[i - 1]; } else { out = secondHalf[i] + firstHalf[i]; } result.push(out); } if (runs > 0) { foldArray(result.reverse(), runs); } else { console.log("returning final: ", result.reverse()); return result.reverse(); } };
测试情况
- 调用
foldArray([1, 2, 3, 4, 5], 1)时,返回预期结果[6, 6, 3] - 调用
foldArray([1, 2, 3, 4, 5], 2)时,console.log能输出正确结果[6, 9],但函数返回undefined
问题原因及解决方法
问题出在递归调用未返回结果:当runs > 0时,代码仅执行了递归调用foldArray(result.reverse(), runs),但没有将递归调用的返回值传递给上层函数,导致上层函数默认返回undefined。
修改方式很简单,在递归调用前加上return关键字:
if (runs > 0) { return foldArray(result.reverse(), runs); } else { console.log("returning final: ", result.reverse()); return result.reverse(); }
递归调用本身会处理剩余的折叠次数并返回最终结果,只有将这个结果返回,才能保证整个调用链正确传递最终的折叠数组。
内容的提问来源于stack exchange,提问作者Lefeba Gougis III
相关产品推荐
相关产品推荐

