javascript遞歸函數(shù)定義和用法示例分析
遞歸函數(shù):是指函數(shù)直接或間接調(diào)用函數(shù)本身,則稱該函數(shù)為遞歸函數(shù)。
這句話理解起來并不難,從概念上出發(fā),給出以下的例子:
function foo(){ console.log('函數(shù) foo 是遞歸函數(shù)。'); foo();}
這個例子的 foo 函數(shù)就是一個遞歸函數(shù)。
當你把這個函數(shù)拿到瀏覽器上運行的時候,你會發(fā)現(xiàn)內(nèi)存溢出了,為什么呢?因為這個遞歸函數(shù)沒有停止處理或運算的出口,因此這個遞歸函數(shù)就演變?yōu)橐粋€死循環(huán)。
那如何使用遞歸呢?
使用遞歸函數(shù)必須要符合兩個條件:
1、 在每一次調(diào)用自己時,必須是(在某種意義上)更接近于解;
這句話怎么理解?
大家家里都有樓梯吧?比如從一樓走到二樓,那么我們的起點是一樓,目的地是二樓,當你往上每走一個臺階是不是越接近二樓,也就是越接近目的地。因此這句話可以這樣理解:函數(shù)每一次調(diào)用自己時,就越接近于我們期望它完成的任務的終點。
2、必須有一個終止處理或計算的出口。
這句話的意思是:必須要有一個標準的標志,讓函數(shù)結(jié)束調(diào)用函數(shù)自身。比如,怎么知道你已經(jīng)走到二樓了呢?當你看到有個門,門牌上寫著 2F 的,然后推開它跨過去,那么你就到二樓了。
用遞歸輸出對象里包含的所有屬性值(包括對象里的子孫對象):
var obj = { a:{ name:'john', age:26, sex:'male', child:{ firstChild:'mak', laseChild:'loy' } }, b:{ name:'joe', age:28, sex:'female', child:{ firstChild:'bill', secondChild:'ruth', laseChild:'yoki' } }};function getObjValue(obj){ for(var k in obj){ if(typeof obj[k] !== 'object'){ console.log(obj[k]); //遞歸出口 }else{ getObjValue(obj[k]); //函數(shù)調(diào)用函數(shù)自身 } }};getObjValue(obj);
// 輸出結(jié)果:
// name=john// age=26// sex=male// firstChild=mak// laseChild=loy// name=joe// age=28// sex=female// firstChild=bill// secondChild=ruth// laseChild=yoki
使用建議:在使用遞歸時,要注意對遞歸函數(shù)的參數(shù)類型的檢查,一定要保證有一個終止處理或計算的出口。否則很容易演變?yōu)樗姥h(huán),從而造成內(nèi)存溢出。
到此這篇關于javascript遞歸函數(shù)定義和用法示例分析的文章就介紹到這了,更多相關javascript遞歸函數(shù)內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!
相關文章:
1. php使用正則驗證密碼字段的復雜強度原理詳細講解 原創(chuàng)2. vue前端RSA加密java后端解密的方法實現(xiàn)3. JSP+Servlet實現(xiàn)文件上傳到服務器功能4. 基于jsp+mysql實現(xiàn)在線水果銷售商城系統(tǒng)5. 基于javaweb+jsp實現(xiàn)企業(yè)財務記賬管理系統(tǒng)6. CSS可以做的幾個令你嘆為觀止的實例分享7. ASP動態(tài)網(wǎng)頁制作技術經(jīng)驗分享8. ASP中實現(xiàn)字符部位類似.NET里String對象的PadLeft和PadRight函數(shù)9. 利用CSS3新特性創(chuàng)建透明邊框三角10. 淺談由position屬性引申的css進階討論

網(wǎng)公網(wǎng)安備