微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这个用于创建范围的递归函数如何工作?

如何解决这个用于创建范围的递归函数如何工作?

| 从这个SO问题中选择的答案中,这个非常巧妙的函数创建了一个范围从1到i的数组:
function range1(i){return i?range1(i-1).concat(i):[]}
它工作完美。叫我愚蠢,但我无法理解它的工作原理。假设我们有
range1(5)
。现在进入函数,我们有了
i
,因此它以参数
i-1
(4)返回自身并向其连接
i
(5)。但是这里我被困住了:
range1
如何知道它与数组有关?我想说的是,在第一次运行后,返回值(只要我们有
i
,所以
i!==0
)就是一个数字。而且Number没有
concat
方法。有人可以解释吗?我想念什么?     

解决方法

           现在进入函数,我们有i,   所以它用参数返回自己   i-1(4)并连接到它(5)。 不,它不会自行返回。它所做的是调用本身,即递归,然后返回该调用的结果以及最后一个串联的元素。 因此,
range1(5)
将叫
range1(4)
,which11会以此类推。当它达到零时,它将停止进行调用并仅返回一个空数组。
range1(0)
返回
[]
,因此so14ѭ返回
[].concat(1)
[1]
,然后
range1(2)
返回
[1].concat(2)
[1,2]
,依此类推。当我们回到
range1(5)
它返回
[1,2,3,4].concat(5)
,即
[1,4,5]
。 注意:此函数可以很好地创建较小的数组,但是如果您需要较大的数组,则只需创建一个数组并使用常规循环填充它会更快。     ,        我扩展了此代码,因为我发现这种方式更容易理解。
function range1(i){
  if (i != 0) {
     return range1(i - 1).concat(i);
  } else {
     return [];
}
该功能背后的逻辑是,如果您想要
3
个元素的列表(
range(3)
),则采用
2
个元素的列表(
range1(i - 1)
),并将
3
添加到它的末尾
.concat(i)
。除此之外,您只需要处理特殊情况,即
range1(0)
是空数组
[]
,就可以了。 想像一下打给
range1(2)
的电话。从
i != 0
开始,我们得到
range(2) = range(1).concat(2)
range(1)
回报
range(0).concat(1)
,给我们
range(2) = range(0).concat(1).concat(2)
好吧,
range(0)
是什么?从
i == 0
开始,我们得到了所需的空数组(
[]
)!
range(2) = [].concat(1).concat(2) -> [1,2]
    ,        递归的基本情况是
[]
,因此递归的尾部将返回一个数组,而其他步骤将连接到
[]
(和之前的步骤)。     ,        让我们取范围1(4):
range1(4) => range1(3).concat(4)
range1(3) => range1(2).concat(3)
range1(2) => range1(1).concat(2)
range1(1) => range1(0).concat(1)
range1(0) => []
现在,取第一行,并用下一行的等价内容替换range1(3)。你得到这个:
range1(4) => range1(2).concat(3).concat(4)
继续替换range1引用,直到没有剩余为止。最后结果:
range1(4) => [].concat(1).concat(2).concat(3).concat(4)
    ,        
range1
函数始终返回一个数组。 它可以是一个空数组(对于i == 0)或一个串联数组。     ,        在基本情况下,“ 5”返回一个定义为“ 8”的空数组。然后展开时,范围内的数字将添加到数组中。     ,        直到我变成0为止,除了带有重定值的校准函数外,没有其他任何事情发生,但是当它以0调用时,它返回[]-先前调用中的一个空数组加上了concat方法...看起来像range(0).concat(1 )=> [] .concat(1),因此[1]返回到上一个调用:[1] .concat(2),依此类推     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。