递归填充数组未从n遍历至0仅到n的一半,求原因排查
递归填充数组问题排查与修复
问题描述
我希望使用递归函数填充数组,预期返回包含从n到0所有数字的数组,但实际返回的数组仅包含从n到其一半的数字,无法排查问题原因。代码如下:
let fillArrayBackwards = (n : number, a : number[]) : number[] =>{ a.push(n); return a.length <= n ? fillArrayBackwards(--n, a) : a; } console.log(fillArrayBackwards(10,[]));
问题原因
递归终止条件a.length <= n逻辑错误。每轮递归中,数组长度a.length递增1,同时n递减1,两者的差距会逐渐缩小。以n=10为例:
- 初始数组长度0,push10后长度1,n=10 → 1<=10,继续递归,n变为9
- 数组长度2,n=9 → 2<=9,继续,n变为8
- ...
- 数组长度6时,n已减到5 → 6<=5不成立,递归终止,最终数组只到5,正好是原n的一半。
我们的目标是把n到0的所有数加入数组,因此终止条件应该判断n是否大于0——只要n还没到0,就继续递归将n-1加入数组。
修复后的代码
let fillArrayBackwards = (n : number, a : number[]) : number[] =>{ a.push(n); // 当n大于0时继续递归,直到n为0时返回结果 return n > 0 ? fillArrayBackwards(--n, a) : a; } console.log(fillArrayBackwards(10,[])); // 输出:[10,9,8,7,6,5,4,3,2,1,0]
内容的提问来源于stack exchange,提问作者fujitsu fiji
相关产品推荐
相关产品推荐

