Javascript ES6递归函数
Javascript ES6 recursion function
我想知道这个递归如何在这个空数组 (return n < 1 ? []
) 中运行 return 个数字而不从 [n, ...countdown(n - 1)]
推入,或者它是如何推入的?也许我不明白 es6 语法
function countdown(n){ return n < 1 ? [] : [n, ...countdown(n - 1)] }
console.log(countdown(5))
日志:[5, 4, 3, 2, 1]
此特定上下文中的 ...
前缀语法(称为“spread syntax”)将 ...
前缀数组的元素直接放入周围数组中。
[ 5, ...[4, 3, 2, 1] ]
与
相同
[5, 4, 3, 2, 1]
这就是这里发生的事情。 countdown
的 return 值(从基本情况到 countdown(5)
)看起来像:
[]
[1, ...[]] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
[5, ...[4, 3, 2, 1]] => [5, 4, 3, 2, 1]
产生结果的调用堆栈步骤:
1. n = 5 => [5, ...countdown(4)]
2. n = 4 => [5, 4, ...countdown(3)]]
3. n = 3 => [5, 4, 3, ...countdown(2)]]
4. n = 2 => [5, 4, 3, 2, ...countdown(1)]
5. n = 1 => [5, 4, 3, 2, 1, ...countdown(0)]
6. n = 0 => [5, 4, 3, 2, 1, ...[]]
所以 ...
正在扩展语法符号,其工作方式类似于 concat
用于两个数组。
另一个模式可能是这样的:
1. n = 5 => [5, ...countdown(4)]
2. n = 4 => [5, ...[4, ...countdown(3)]]
3. n = 3 => [5, ...[4, ...[3, ...countdown(2)]]]
4. n = 2 => [5, ...[4, ...[3, ..[2, ...countdown(1)]]]]
5. n = 1 => [5, ...[4, ...[3, ...[2, ...[1, ...countdown(0)]]]]]
6. n = 0 => [5, ...[4, ...[3, ...[2, ...[1, ...[]]]]]]
从左到右考虑函数调用堆栈:
x1( x2( x3() ) ) => ...( ...( ...(n) ) )
我想知道这个递归如何在这个空数组 (return n < 1 ? []
) 中运行 return 个数字而不从 [n, ...countdown(n - 1)]
推入,或者它是如何推入的?也许我不明白 es6 语法
function countdown(n){ return n < 1 ? [] : [n, ...countdown(n - 1)] }
console.log(countdown(5))
日志:[5, 4, 3, 2, 1]
此特定上下文中的 ...
前缀语法(称为“spread syntax”)将 ...
前缀数组的元素直接放入周围数组中。
[ 5, ...[4, 3, 2, 1] ]
与
相同[5, 4, 3, 2, 1]
这就是这里发生的事情。 countdown
的 return 值(从基本情况到 countdown(5)
)看起来像:
[]
[1, ...[]] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
[5, ...[4, 3, 2, 1]] => [5, 4, 3, 2, 1]
产生结果的调用堆栈步骤:
1. n = 5 => [5, ...countdown(4)]
2. n = 4 => [5, 4, ...countdown(3)]]
3. n = 3 => [5, 4, 3, ...countdown(2)]]
4. n = 2 => [5, 4, 3, 2, ...countdown(1)]
5. n = 1 => [5, 4, 3, 2, 1, ...countdown(0)]
6. n = 0 => [5, 4, 3, 2, 1, ...[]]
所以 ...
正在扩展语法符号,其工作方式类似于 concat
用于两个数组。
另一个模式可能是这样的:
1. n = 5 => [5, ...countdown(4)]
2. n = 4 => [5, ...[4, ...countdown(3)]]
3. n = 3 => [5, ...[4, ...[3, ...countdown(2)]]]
4. n = 2 => [5, ...[4, ...[3, ..[2, ...countdown(1)]]]]
5. n = 1 => [5, ...[4, ...[3, ...[2, ...[1, ...countdown(0)]]]]]
6. n = 0 => [5, ...[4, ...[3, ...[2, ...[1, ...[]]]]]]
从左到右考虑函数调用堆栈:
x1( x2( x3() ) ) => ...( ...( ...(n) ) )