我對編程還很陌生,而且我是第一次學習基本的遞回。我剛剛在 JavaScript 中玩了一個練習題,結果真的是在烤我的面條。
function countDownRecursive(n) {
if (n == 0) {
console.log('Hooray!')
return
} else {
console.log(n)
countDownRecursive(n-1)
console.log(n)
}
}
即,countDownRecursive(3) 的輸出是
3 2 1 萬歲!1 2 3
我的問題是為什么像這樣將 console.log() 放在 countDownRecursive(n-1) 之后會導致 JS 反向記錄值?
uj5u.com熱心網友回復:
在初始呼叫時,else輸入,并且
console.log(n)
countDownRecursive(n-1)
3 已記錄。然后,呼叫countDownRecursive(3)while 掛起的初始函式countDownRecursive(3-1)。堆疊現在由countDownRecursive(3).
同樣的事情發生在countDownRecursive(2). 2 被記錄,并且通過它的遞回呼叫,堆疊現在由countDownRecursive(2)和組成countDownRecursive(3)。
等等。最后,與countDownRecursive(0),堆疊是
countDownRecursive(0) <-- current function
countDownRecursive(1)
countDownRecursive(2)
countDownRecursive(3)
并3 2 1已登錄。
在 0 處,不再有遞回,所以有Hooray. 最里面的countDownRecursive(0)結束,然后countDownRecursive(1)在遞回呼叫點的點恢復:
countDownRecursive(1-1) // this line just finished
console.log(1)
所以 1 被記錄,該功能結束。
這些函式不斷恢復、記錄和退出,直到堆疊為空,并且您只剩下以下日志
3
2
1
Hooray!
1
2
3
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/356408.html
標籤:javascript 递归 调用栈
上一篇:串列拆分的python組合
