簡體   English   中英

我不明白這種遞歸情況

[英]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)

循環 1:

1a) n 不小於 1

1b) 一個 arr 被初始化並設置為倒計時(1)

循環 2:

2a) n 不小於 1

2b) 一個 arr 被初始化並設置為倒計時(0)

循環 3:

3a) n 小於 1

3b) 一個空數組返回到循環 2

arr 是 []

循環 2 續。

2c) arr.unshift 將數字 2 添加到數組的開頭。

arr 是 [2]

2d) arr 返回到循環 1

循環 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.

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