You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript递归函数rep为何能生成n重复x次的数组?

JavaScript递归函数rep的工作原理解析

先贴出你的代码:

let arr = []

function rep(x, n) {
  if (Math.sign(x) === -1) {
    return []
  }

  if (x < 1) {
    return 1
  } else {
    rep(x - 1, n)
  }
  arr.push(n)
  return arr
}
console.log(rep(5, 5))

核心逻辑拆解

1. 全局数组arr的关键作用

你定义的arr是全局变量,所有递归调用的rep函数都会操作同一个数组,不会每次递归都创建新数组。这是最终能攒出完整数组的基础。

2. 递归执行的完整流程(以rep(5,5)为例)

我们一步步捋执行顺序:

  • 调用rep(5,5):x=5不满足前两个if条件,进入else分支,调用rep(4,5)
  • 调用rep(4,5):同样不满足前两个if,调用rep(3,5)
  • 重复这个过程,直到调用rep(0,5):x=0满足x<1,返回1——但注意:这个返回值没有被任何外层调用接收,因为外层的else分支只是执行rep(x-1,n),既没有把返回值赋值给变量,也没有return它
  • 从rep(0,5)返回后,回到rep(1,5)的else分支之后,执行arr.push(5),然后返回arr(此时arr里有1个5)
  • 回到rep(2,5)的else分支之后,执行arr.push(5),返回arr(此时arr里有2个5)
  • 以此类推,直到回到最开始的rep(5,5),执行arr.push(5),此时arr里已经有5个5,最后返回这个数组

3. 为什么不会返回[]或1

  • 关于return []:只有当你传入的x一开始就是负数(比如rep(-3,5)),才会触发这个分支直接返回空数组。正常调用x是正整数,根本不会走到这里。
  • 关于return 1:这个返回值只在递归的最底层(x=0)产生,但外层调用完全没处理这个返回值——上层函数在执行完rep(x-1,n)后,会继续执行后面的arr.push(n)和return arr,所以1根本不会被传递到外层,更不会成为最终的返回结果。

额外隐患提醒

这个函数有个明显问题:因为arr是全局变量,第二次调用rep时,数组会保留上一次的结果。比如先调用rep(2,5)得到[5,5],再调用rep(3,3)会得到[5,5,3,3,3],不符合预期。如果要修复,应该把arr放在函数内部初始化,或者用纯递归的方式构建数组(不需要全局变量)。

内容的提问来源于stack exchange,提问作者Roblou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:37:13