JavaScript中遞歸實(shí)現(xiàn)的方法及其區(qū)別
遞歸函數(shù):遞歸函數(shù)是在通過名字調(diào)用自身的情況下構(gòu)成的。
遞歸實(shí)現(xiàn)階乘函數(shù):
方法一:通過使用函數(shù)的名字
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } console.log(factorial(4));
結(jié)果為:24;
但是這種方法實(shí)現(xiàn)遞歸有一個(gè)問題,觀察以下代碼:
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } var anthorFactorial=factorial; console.log(anthorFactorial(4));
結(jié)果為:24;
但是:
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } var anthorFactorial=factorial; factorial=null; console.log(anthorFactorial(4));
結(jié)果為:報(bào)錯(cuò)
這是因?yàn)椋?/p>
我們定義的函數(shù)名,其實(shí)是指向函數(shù)的一個(gè)指針,定義的anotherFactorial 也指向了那個(gè)函數(shù),所以調(diào)用anotherFactorial (4)可以成功的輸出24
當(dāng) factorial = null時(shí),執(zhí)行定義函數(shù)的引用就剩下了anotherFactorial,那么在調(diào)用anotherFactorial(4)就會(huì)顯示以上的錯(cuò)誤的信息。
此時(shí)可以使用arguments.callee來替代函數(shù)定義中的 factorial。
方法二:通過使用arguments.callee
function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } var anthorFactorial=factorial; factorial=null; console.log(anthorFactorial(4));
結(jié)果為:24
arguments.callee是一個(gè)指向正在執(zhí)行的函數(shù)的指針,因此可以用arguments.callee來實(shí)現(xiàn)對(duì)函數(shù)的遞歸調(diào)用。通過使用arguments.callee來代替函數(shù)名,可以保證在調(diào)用函數(shù)時(shí)無論怎樣都不會(huì)出現(xiàn)問題。因此,在編寫遞歸函數(shù)時(shí),使用argumnts.callee總比使用函數(shù)名更加保險(xiǎn)。
但是,在嚴(yán)格模式下,不能通過腳本訪問arguments.callee,訪問這個(gè)屬性會(huì)報(bào)錯(cuò),不過可以通過命名函數(shù)表達(dá)式來達(dá)到相同的效果。
方法三:通過命名函數(shù)表達(dá)式
var factorial=function f(num){ if(num<=1){ return 1; }else{ return num*f(num-1); } }; f=null; console.log(factorial(4));
這種方式在嚴(yán)格和非嚴(yán)格模式下都有效。
總結(jié)
以上所述是小編給大家介紹的JavaScript中遞歸實(shí)現(xiàn)的方法及其區(qū)別,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 利用java+mysql遞歸實(shí)現(xiàn)拼接樹形JSON列表的方法示例
- Javascript 實(shí)現(xiàn)匿名遞歸的實(shí)例代碼
- JS基于遞歸算法實(shí)現(xiàn)1,2,3,4,5,6,7,8,9倒序放入數(shù)組中的方法
- Vue.js 遞歸組件實(shí)現(xiàn)樹形菜單(實(shí)例分享)
- JS基于遞歸實(shí)現(xiàn)倒計(jì)時(shí)效果的方法
- AngularJS遞歸指令實(shí)現(xiàn)Tree View效果示例
- java、js中實(shí)現(xiàn)無限層級(jí)的樹形結(jié)構(gòu)方法(類似遞歸)
- javascript實(shí)現(xiàn)網(wǎng)頁(yè)子頁(yè)面遍歷回調(diào)的方法(涉及 window.frames、遞歸函數(shù)、函數(shù)上下文)
- 一個(gè)JavaScript遞歸實(shí)現(xiàn)反轉(zhuǎn)數(shù)組字符串的實(shí)例
相關(guān)文章
一文總結(jié)JavaScript中常見的設(shè)計(jì)模式
在程序設(shè)計(jì)中有很多實(shí)用的設(shè)計(jì)模式,而其中大部分語言的實(shí)現(xiàn)都是基于“類”。在程序設(shè)計(jì)中有很多實(shí)用的設(shè)計(jì)模式,而其中大部分語言的實(shí)現(xiàn)都是基于“類”。,本文將總結(jié)了JavaScript中常見的十五種設(shè)計(jì)模式,感興趣的朋友可以參考下2023-05-05javascript異步編程代碼書寫規(guī)范Promise學(xué)習(xí)筆記
這篇文章主要介紹了javascript異步編程代碼書寫規(guī)范Promise學(xué)習(xí)筆記,需要的朋友可以參考下2015-02-02JavaScript對(duì)象擴(kuò)展方法的用法詳解
JavaScript對(duì)象中的可擴(kuò)展性指的是:是否可以給對(duì)象添加新屬性。所有的內(nèi)置對(duì)象和自定義對(duì)象顯示的都是可擴(kuò)展的,對(duì)于宿主對(duì)象,則由JavaScript引擎決定2022-11-11Code Review 方法論與實(shí)踐總結(jié)梳理
這篇文章主要為大家介紹了Code Review 方法論與實(shí)踐總結(jié)梳理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02javascript 緩沖運(yùn)動(dòng)框架的實(shí)現(xiàn)
這篇文章主要介紹了javascript 緩沖運(yùn)動(dòng)框架的實(shí)現(xiàn)的相關(guān)資料,希望通過本能幫助到大家,實(shí)現(xiàn)這樣類似的功能,需要的朋友可以參考下2017-09-09微信小程序 點(diǎn)擊切換樣式scroll-view實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了微信小程序 點(diǎn)擊切換樣式scroll-view實(shí)現(xiàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10