簡體   English   中英

帶返回語句和不帶返回語句的 Javascript 遞歸

[英]Javascript recursion with return statement and without

這兩個遞歸函數有區別嗎? 對於遞歸調用,一個帶有 return 語句,另一個沒有它。 他們都在控制台瀏覽器中打印數字 1 - 8,我的問題是當遞歸發生時是否有一些優化發生在后台。

 const solution = (input, i = 0) => { if (i === input) return // base case console.log(i) return solution(input, i + 1) // return recursive call } const solution2 = (input, i = 0) => { if (i === input) return // base case console.log(i) solution2(input, i + 1) // recursive call } console.log(solution(4)) console.log("----") console.log(solution2(4))

如果最終的遞歸調用沒有返回任何內容(如您問題中的示例),則沒有區別。

如果最終的遞歸調用確實返回了一些東西,並且您希望它滲透到solution的初始調用者,那么您確實需要返回遞歸調用:

 const solution = (input, i = 0) => { if (i === input) return 'returnVal' // base case return solution(input, i + 1) // return recursive call } const solution2 = (input, i = 0) => { if (i === input) return 'returnVal' // base case solution2(input, i + 1) // recursive call } console.log(solution(9)) console.log("----") console.log(solution2(9))

ES6確實指定了一個遞歸函數,其最終動作是return對自身的調用,應該導致遞歸調用而不增加調用堆棧。 如果實現,這意味着,例如,在解析之前遞歸調用自身 100,000 次的函數可以成功運行,而不會溢出堆棧。 (如果沒有尾調用優化,這種情況會導致堆棧溢出。)

但是,不幸的是,正如您從上面的鏈接中看到的,盡管它是規范的一部分,但並未得到廣泛實施,因此您希望的優化在大多數環境中實際上並不存在。

暫無
暫無

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

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