求助:使用JavaScript递归反转数组失败,求排查代码问题
递归反转数组代码的问题分析与修复
核心问题
你的代码逻辑本身可以完成从索引m+1到末尾的数组反转,但有两个关键问题导致你觉得功能失效:
返回值错误
reverseArray函数返回的是reverseArrayHelper的调用结果,但reverseArrayHelper在基准条件(left >= right)触发时返回undefined,递归过程中也只是传递下一层调用的结果,最终整个reverseArray会返回undefined,而不是你期望的反转后的数组。对原地修改的认知偏差
reverseArrayHelper是原地修改输入数组的,实际上调用函数后原数组已经被正确反转了,但你console.log的是reverseArray的返回值(undefined),所以误以为功能没生效。
修复后的代码
只需要修改reverseArray函数,让它返回已经被修改的数组即可:
function reverseArrayHelper(left, right, arr) { if (left >= right) return; // 交换左右指针元素 let temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; reverseArrayHelper(left + 1, right - 1, arr); } function reverseArray(arr, m) { reverseArrayHelper(m + 1, arr.length - 1, arr); return arr; // 返回修改后的数组 } console.log(reverseArray([1, 2, 3, 4, 5, 6], 3)); // 输出 [1, 2, 3, 6, 5, 4]
可选优化:避免原地修改原数组
如果不想改变输入的原数组,可以在reverseArray里先复制一份数组再处理:
function reverseArrayHelper(left, right, arr) { if (left >= right) return; let temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; reverseArrayHelper(left + 1, right - 1, arr); } function reverseArray(arr, m) { const newArr = [...arr]; // 浅复制原数组 reverseArrayHelper(m + 1, newArr.length - 1, newArr); return newArr; } const originalArr = [1, 2, 3, 4, 5, 6]; console.log(reverseArray(originalArr, 3)); // 输出 [1, 2, 3, 6, 5, 4] console.log(originalArr); // 原数组保持不变 [1, 2, 3, 4, 5, 6]
内容的提问来源于stack exchange,提问作者MeAtWork
相关产品推荐
相关产品推荐

