簡體   English   中英

Javascript ES6 遞歸函數

[英]Javascript ES6 recursion function

我想知道這個遞歸函數如何在這個空數組中返回數字( return n < 1 ? [] )而不從[n, ...countdown(n - 1)]推送,或者它是如何推送的? 也許我不明白 es6 語法

function countdown(n){ return n < 1 ? [] : [n, ...countdown(n - 1)] }

console.log(countdown(5))日志: [5, 4, 3, 2, 1]

所述... -prefix語法在此特定上下文(稱為“ 擴展句法”)放的元件... -prefixed陣列直接到周圍的陣列。

[ 5, ...[4, 3, 2, 1] ]

是相同的

[5, 4, 3, 2, 1]

這就是這里發生的事情。 countdown的返回值(從基本情況到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) ) )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM