使用pop方法清空数组并转移弹出元素时中途停止的问题排查
为什么递归结合pop清空数组时会中途停止?
让我来帮你拆解问题所在:你的递归终止条件n <= arr.length是导致操作中途停止的核心原因。
问题分析
我们一步步走一遍你的代码执行过程,就能清楚看到问题:
- 初始状态:
arr = [1,2,3,4,5,6,7](长度7),n=0 n=0 <=7:执行arr.pop(),arr变成[1,2,3,4,5,6](长度6),newArr添加7,递归调用fib(1)n=1 <=6:执行pop,arr长度变为5,newArr添加6,递归fib(2)n=2 <=5:arr长度4,newArr添加5,递归fib(3)n=3 <=4:arr长度3,newArr添加4,递归fib(4)- 此时
n=4,arr.length=3,4<=3不成立,递归直接终止
这就导致arr中剩下的[1,2,3]根本没被处理,所以newArr最终只有[7,6,5,4]。问题出在:你同时依赖了两个动态变化的值(递增的n和递减的arr.length)作为终止条件,两者的变化速度一致,很快就会不满足条件,无法遍历完所有元素。
解决方案
这里有两种简单的修复方式:
方案1:直接判断数组是否为空(最直观)
放弃用n作为参数,只要数组还有元素就继续执行pop:
let arr = [1,2,3,4,5,6,7] let newArr = [] const reverseArray = function() { if (arr.length > 0) { newArr.push(arr.pop()) reverseArray() } } reverseArray() console.log(newArr) // 输出 [7,6,5,4,3,2,1]
方案2:基于初始数组长度设置终止条件
如果一定要保留n参数,可以用数组的初始长度作为判断依据,而不是动态变化的arr.length:
let arr = [1,2,3,4,5,6,7] let newArr = [] const initialLength = arr.length // 保存初始长度 const fib = function(n){ if(n < initialLength){ // 用初始长度判断,而不是当前arr.length newArr.push(arr.pop()) return fib(n+1) } } fib(0) console.log(newArr) // 输出 [7,6,5,4,3,2,1]
这两种方式都能确保pop操作执行足够多次,把原数组的所有元素都转移到newArr中。
内容的提问来源于stack exchange,提问作者Aliayub Ali
相关产品推荐
相关产品推荐

