[英]I don't understand this case of recursion
這是 FreeCodeCamp 上此練習的解決方案
function countdown(n) {
if (n < 1) {
return [];
} else {
const arr = countdown(n - 1);
arr.unshift(n);
return arr;
}
}
我理解遞歸的概念。 我知道函數倒計時將重復直到 n < 1 並且一旦將評估 n 的所有可能值,將執行以下命令 arr.unshift(n) 。 讓我感到困擾的是,我不知道 const arr 何時或如何變為和數組。
讓我感到困擾的是,我不知道 const arr 何時或如何變為和數組。
看到基本情況返回一個空數組了嗎? 這就是一切開始的地方,因為一旦代碼從遞歸調用返回,您就可以繼續處理數組結構。
代碼說明
Unshift 將在第零個索引處附加 LIFO,意思是
最后一個是 1,它將被添加到數組中,之后數組將在第零個索引處添加數字 2,在第二個索引處添加數字 1,然后將數字 3 添加到第零個索引處,第二個索引將是數字 2,最后一個索引將包含數字 1。現在您看到模式...
嘗試在兩者之間進行 console.log
function countDown(n) {
if (n < 1) {
return [];
} else {
const countArray = countDown(n - 1);
console.log(n)
countArray.unshift(n);
return countArray;
}
}
console.log(countDown(5));
如果您更習慣 ES6+ 語法,請在數組的第一個位置添加第一個元素 n 並解構其余部分。
function countDown(n) {
if (n < 1) {
return [];
} else {
const countArray=[n,...countDown(n - 1)];
return countArray;
}
}
console.log(countDown(5));
最后,您可以使用三元運算符使其成為單行:
const countDown = (n) => n < 1 ? [] : [n, ...countDown(n - 1)];
console.log(countDown(5));
讓我們遵循一個相對簡單的調用的模式。 這里又是這個函數:
function countdown(n) {
if (n < 1) {
return [];
} else {
const arr = countdown(n - 1);
arr.unshift(n);
return arr;
}
}
假設你打電話countdown(2)
:
1a) n 不小於 1
1b) 一個 arr 被初始化並設置為倒計時(1)
2a) n 不小於 1
2b) 一個 arr 被初始化並設置為倒計時(0)
3a) n 小於 1
3b) 一個空數組返回到循環 2
arr 是 []
2c) arr.unshift 將數字 2 添加到數組的開頭。
arr 是 [2]
2d) arr 返回到循環 1
1c) arr.unshift 將數字 1 添加到數組的開頭。
數組是 [1,2]
1d) arr 返回到函數調用
所以如果你寫了let result = countdown(2)
和console.log(result)
,你會得到: [1,2]
讓我感到困擾的是,我不知道 const arr 何時或如何變為和數組。
查看步驟 3b、2b 和 2c:
3b) an empty array is returned to loop 2
2b) an arr is initialized and set to countdown(0)
2c) arr.unshift adds the number 2 to the start of the array.
一個空數組被設置為const arr
,然后將數字 2 添加到該數組中。
現在看看步驟 2d 和 1c:
2d) arr is returned to loop 1
1c) arr.unshift adds the number 1 to the start of the array.
該數組被設置為這樣的新數組( const arr = [2]
),並將數字 1 添加到該數組中。 最后在 1d 中,該新數組返回給調用該函數的表達式。 對於每個遞歸循環,您都有這樣的事情:
const arr = something
new const arr = old const arr
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.