重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
這篇文章將為大家詳細講解有關(guān)JavaScript中遞歸是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供白山網(wǎng)站建設(shè)、白山做網(wǎng)站、白山網(wǎng)站設(shè)計、白山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、白山企業(yè)網(wǎng)站模板建站服務(wù),10余年白山做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
JavaScript中的遞歸就是指函數(shù)反復調(diào)用自己的過程,函數(shù)的調(diào)用是建立在堆棧中,在堆棧的頂部函數(shù)調(diào)用總是第一個彈出的。我們可以通過瀏覽器自帶的開發(fā)工具來查看堆棧的調(diào)用
真正的理解JavaScript 中的遞歸是非常困難的,有的人甚至把它稱為不必要的內(nèi)存密集型和復雜版本的“for循環(huán)”。接下來將在文章中為大家詳細介紹這個知識,希望對大家有所幫助。
編程中的遞歸是什么?
實質(zhì)上, 遞歸是指函數(shù)或子例程反復調(diào)用自己的時候。所有遞歸函數(shù)調(diào)用都必須有一個基本情況。基本情況是讓函數(shù)返回值而不是再次調(diào)用自身的特定條件。為了防止遞歸函數(shù)無限調(diào)用自身, 必須存在基本情況。如果省略或?qū)懭氩徽_, 就會出現(xiàn)錯誤。
不正確的基本情況指的是一個基本情況它不包括所有可能的用戶輸入, 這可能會導致因通過基本情況的特定輸入而導致無休止的遞歸函數(shù)的調(diào)用, 從而導致調(diào)用堆棧溢出。
函數(shù)調(diào)用存儲在調(diào)用堆棧上
函數(shù)的調(diào)用都是存儲在堆棧中,調(diào)用堆棧是堆棧數(shù)據(jù)結(jié)構(gòu)的特定實現(xiàn)。它是一個 LIFO (最后進入, 首先輸出) 數(shù)據(jù)結(jié)構(gòu), 這就意味著放置在堆棧頂部的函數(shù)調(diào)用是第一個彈出的。
例:計算5的階乘
輸出結(jié)果為:120
上述代碼中,當解析到console.log(factorial(5));
時,
首先console.log()將被推送到堆棧上,之后factorial(5) 其結(jié)果將傳遞到console.log()函數(shù)中,當我們輸入factorial(5)時, 調(diào)用堆棧將如下所示
語句return num * factorial(nextNum);
表示階乘函數(shù)返回num (本例中表示5) 乘以遞歸函數(shù)調(diào)用的返回值, 其中4被傳入。實質(zhì)上, 該函數(shù)返回以下值
return 5 * factorial(4);
因為factorial(4)是一個函數(shù), 所以我們將把這個函數(shù)調(diào)用推送到調(diào)用堆棧上。現(xiàn)在我們將重復相同的過程, 直到我們到達基本情況 i. 當num等于1時。此時, 調(diào)用堆棧將如下所示。
一旦我們到達基本情況, 函數(shù)factorial(1)返回值1。因此現(xiàn)在我們知道factorial(1)等于 1, factorial(2) ) 也返回一個非函數(shù)值: 2 * factorial(1) , 即 2 * 1 = 2。
接著, factorial(3)返回3 * factorial(2), 等于6。等等, 直到我們得到factorial(5), 它返回 5 * 24 = 120。
如何查看調(diào)用堆棧
如果使用的是 chrome web 瀏覽器,可按 f12 (在 Windows 上), 打開chrome 開發(fā)人員工具。在頂部選項卡上, 您將看到菜單標簽, 如元素、配置文件、控制臺、網(wǎng)絡(luò)、源等。單擊"源"。如下所示
通過該開發(fā)工具可以直觀地查看調(diào)用堆棧。當遞歸函數(shù)調(diào)用num === 1的條件時, 它將返回1。之后, 當函數(shù)調(diào)用返回時, 每個階乘函數(shù)調(diào)用都將從堆棧中彈出。
關(guān)于JavaScript中遞歸是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。