剛開始學習javascript,我在學習遞回時遇到了這段代碼,有人可以幫我分解一下為什么輸出是[1,2,3,4,5]嗎?
function rangeOfNumbers(startNum, endNum) {
if (endNum - startNum === 0) {
return [startNum];
} else {
var numbers = rangeOfNumbers(startNum, endNum - 1);
numbers.push(endNum);
return numbers;
}
}
console.log(rangeOfNumbers(1,5))
我似乎無法理解這行代碼“var numbers = rangeOfNumbers(startNum, endNum - 1);”
我所知道的是它再次呼叫自己,同時在endNum每次呼叫時減去 1并將其推入numbers陣列
uj5u.com熱心網友回復:
我為這些行寫了一些注釋,以便您了解每行的功能目的,如果您需要更深入地了解發生的情況,請嘗試使用 IDE 的除錯工具(例如 vscode)。
在那里你會看到你將進入 else 陳述句,遞回呼叫函式,再次跳轉到 else 和遞回,直到你到達第一個定義的末尾if,然后你完成呼叫遞回并且 everz 遞回狀態將呼叫下一行在那里你壓入數字,然后回傳到下一個更高的遞回狀態。
所以 1,3 的運行:
3 > 1, => recurse to 2>1, => recurse to 1=1, break recursion, push 1, step out, push 2, step out, push 3,那么你就完成了
function rangeOfNumbers(startNum, endNum) {
if (endNum - startNum === 0) { // This statement checks if the recursion has hit its end when endNum === startNum
return [startNum]; // This is the point when the recursion is stopped
} else {
var numbers = rangeOfNumbers(startNum, endNum - 1); // If the recursion is not finished yet, the function will call itself with the reduced endNum
numbers.push(endNum); // This is first called in the deepest recursion, so the first one to be added is 1, then it steps back to the recursion state one above and in this case adds the 2 to the array
return numbers; // Finally we return to be done with the function
}
}
console.log(rangeOfNumbers(1,5)) // This is the start, the function is called with the 2 parameters 1 and 5
uj5u.com熱心網友回復:
讓我們假設(現在)rangeOfNumbers(a,b)產生從a到b(包括)的數字串列。
現在您特別詢問的部分是有道理的:從startNum到endNum(包括)獲取數字串列:
- 計算從
startNum到但不包括 的數字串列endNum。 - 添加
endNum到該串列的末尾
這留下了我們討厭的假設:我們的功能只有在更短的范圍內才有效。這就是問題所在if:如果串列只包含一個值,則回傳一個僅包含該值的串列,而不進行遞回呼叫(這顯然應該是正確的)。
意思是:
- 該函式適用于長度為 1 的串列(
if代碼) - 它適用于長度為 2 的串列(通過對長度為 1 的串列進行遞回呼叫,我們剛剛建立了它)。
- 它適用于長度為 3 的串列(通過遞回呼叫長度為 2 的串列,這是我們剛剛建立的作品)。
- ...
- 它適用于長度為 N 的串列(通過遞回呼叫長度為 N-1 的串列,我們剛剛建立了它)。
這意味著它適用于可以表示串列長度的任何 N 值。
uj5u.com熱心網友回復:
添加日志將幫助您可視化代碼中發生的事情。它將向您展示如何進行呼叫以及使用哪些引數。注意:Stackoverflow 日志沒有縮進,所以最好查看瀏覽器的控制臺來查看它。
function rangeOfNumbers(startNum, endNum) {
console.group("rangeOfNumbers called with ", startNum, endNum);
console.log("Subtraction = ", endNum - startNum);
if (endNum - startNum === 0) { // did we hit the end point?
console.log("We got zero. Returning ", startNum);
console.groupEnd();
return [startNum];
} else { // numbers are different
console.log("Calling rangeOfNumbers inside of else");
var numbers = rangeOfNumbers(startNum, endNum - 1); // Make a new call with end number reduced by one
console.log("rangeOfNumbers call returned", numbers.join(", "));
numbers.push(endNum);
console.log("pushing ", endNum);
console.log("numbers updated with", numbers.join(", "));
console.groupEnd();
return numbers;
}
}
console.log(rangeOfNumbers(1,5))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/378830.html
標籤:javascript 递归
