這篇文章將為大家詳細講解有關JavaScript中遞歸是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
JavaScript中的遞歸就是指函數反復調用自己的過程,函數的調用是建立在堆棧中,在堆棧的頂部函數調用總是第一個彈出的。我們可以通過瀏覽器自帶的開發工具來查看堆棧的調用
真正的理解JavaScript 中的遞歸是非常困難的,有的人甚至把它稱為不必要的內存密集型和復雜版本的“for循環”。接下來將在文章中為大家詳細介紹這個知識,希望對大家有所幫助。
編程中的遞歸是什么?
實質上, 遞歸是指函數或子例程反復調用自己的時候。所有遞歸函數調用都必須有一個基本情況?;厩闆r是讓函數返回值而不是再次調用自身的特定條件。為了防止遞歸函數無限調用自身, 必須存在基本情況。如果省略或寫入不正確, 就會出現錯誤。
不正確的基本情況指的是一個基本情況它不包括所有可能的用戶輸入, 這可能會導致因通過基本情況的特定輸入而導致無休止的遞歸函數的調用, 從而導致調用堆棧溢出。
函數調用存儲在調用堆棧上
函數的調用都是存儲在堆棧中,調用堆棧是堆棧數據結構的特定實現。它是一個 LIFO (最后進入, 首先輸出) 數據結構, 這就意味著放置在堆棧頂部的函數調用是第一個彈出的。
例:計算5的階乘
<script> function factorial(num) { var nextNum = num - 1; if (num === 1) { return num; } return num * factorial(nextNum); } console.log(factorial(5)); </script>
輸出結果為:120
上述代碼中,當解析到console.log(factorial(5));
時,
首先console.log()將被推送到堆棧上,之后factorial(5) 其結果將傳遞到console.log()函數中,當我們輸入factorial(5)時, 調用堆棧將如下所示
語句return num * factorial(nextNum);
表示階乘函數返回num (本例中表示5) 乘以遞歸函數調用的返回值, 其中4被傳入。實質上, 該函數返回以下值
return 5 * factorial(4);
因為factorial(4)是一個函數, 所以我們將把這個函數調用推送到調用堆棧上?,F在我們將重復相同的過程, 直到我們到達基本情況 i. 當num等于1時。此時, 調用堆棧將如下所示。
一旦我們到達基本情況, 函數factorial(1)返回值1。因此現在我們知道factorial(1)等于 1, factorial(2) ) 也返回一個非函數值: 2 * factorial(1) , 即 2 * 1 = 2。
接著, factorial(3)返回3 * factorial(2), 等于6。等等, 直到我們得到factorial(5), 它返回 5 * 24 = 120。
如何查看調用堆棧
如果使用的是 chrome web 瀏覽器,可按 f12 (在 Windows 上), 打開chrome 開發人員工具。在頂部選項卡上, 您將看到菜單標簽, 如元素、配置文件、控制臺、網絡、源等。單擊"源"。如下所示
通過該開發工具可以直觀地查看調用堆棧。當遞歸函數調用num === 1的條件時, 它將返回1。之后, 當函數調用返回時, 每個階乘函數調用都將從堆棧中彈出。
關于JavaScript中遞歸是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。