JavaScript遞歸詳述
一、什么是遞歸?
如果一個函數(shù)在內(nèi)部可以調(diào)用其本身,那么這個函數(shù)就是遞歸函數(shù)。簡單理解:函數(shù)內(nèi)部自己調(diào)用自己, 這個函數(shù)就是遞歸函數(shù)。
如下所示:
function fn(){ fn(); } fn();
這個函數(shù)就是一個遞歸函數(shù),當(dāng)我們直接打印時,會:
發(fā)現(xiàn)打印錯誤,這是為什么呢?因為遞歸函數(shù)的作用和循環(huán)效果一樣。當(dāng)沒有給他返回值的時候,它就會一直死循環(huán)下去。所以,我們知道了:
由于遞歸很容易發(fā)生“棧溢出”錯誤(stack overflow
),所以必須要加退出條件 return
。
那正確的遞歸函數(shù)應(yīng)該怎樣寫呢?以上述代碼為例:比如我們現(xiàn)在要打印五遍‘你好’,這時,我們應(yīng)該這樣來寫:
var num = 1; function fn(){ console.log('你好'); if(num == 5){ return; } num++; fn(); } fn();
打印結(jié)果為:
知道了遞歸是什么,那我們再來看看如何利用遞歸解決問題吧!
二、利用遞歸求數(shù)學(xué)題
1、求1 * 2 * 3 * 4 …*n的階乘
代碼如下:
function fn(n){ if(n == 1){ return 1; } return n*fn(n-1); } console.log('1-20的階乘為:'+fn(20)); console.log('1-10的階乘為:'+fn(10)); console.log('1-5的階乘為:'+fn(5));
打印結(jié)果為:
2、 求斐波那契數(shù)列
斐波那契數(shù)列,又稱為“兔子數(shù)列”,指的是這樣一個數(shù)列:、1、1、2、3、5、8、13、21、34、……,
即第三項的值為前兩項的加和。用戶輸入一個n,就可以得到該位置的數(shù)。
代碼如下:
function fb(n){ if(n === 1 || n === 2){ return 1; } return fb(n-1) + fb(n-2); } console.log('第3項斐波那契數(shù)列值為:'+fb(3)); console.log('第10項斐波那契數(shù)列值為:'+fb(10));
打印結(jié)果為:
三、利用遞歸求對應(yīng)數(shù)據(jù)對象
根據(jù)id
返回對應(yīng)的數(shù)據(jù)對象
有如下所示的對象:
var date = [{ id:1, name:'電器', goods:[{ id: 11, gname:'手機' },{ id: 12, gname: '電腦' }] },{ id:2, name:'服飾', goods:[{ id : 21, gname:'褲子' },{ id : 22, gname : '外套' }] },{ id : 3, name: '食品' }];
現(xiàn)在要通過輸入id
返回對應(yīng)的數(shù)據(jù)對象。
首先我們可以通過for...Each()來遍歷數(shù)組,得到每一項值,如下所示:
function getId(array,id){ array.forEach(function(value){ console.log(value); }) } getId(date,1);
打印的結(jié)果為:
這時,如果我們想要獲得id為1的對象的值,可以這樣操作:
function getId(array,id){ array.forEach(function(value){ if(value.id === id){ console.log(value); } }) } getId(date,1);
打印結(jié)果為:
可以得到,但是如果我們想要得到id為11的對象的值呢?很明顯,直接調(diào)用該函數(shù)是不可行的,因為我們通過for...Each只是遍歷得到了最外層的對象的值,而內(nèi)層的具體分類并沒有得到,這時,我們就可以通過遞歸調(diào)用getId(array,id)函數(shù),來獲取里層對象的值。
操作如下:
function getId(array,id){ array.forEach(function(value){ if(value.id === id){ console.log(value); }else if(value.goods && value.goods.length !=0){ getId(value.goods,id); } }) } // getId(date,1); getId(date,11);
打印的結(jié)果為:
到此這篇關(guān)于JavaScript
遞歸詳述的文章就介紹到這了,更多相關(guān)JavaScript遞歸內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js前端表單數(shù)據(jù)處理表單數(shù)據(jù)校驗
這篇文章主要為大家介紹了js前端表單數(shù)據(jù)處理表單數(shù)據(jù)校驗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07JavaScript的模塊化開發(fā)框架Sea.js上手指南
Sea.js的目的是追求簡單的代碼書寫和組織方式,Sea.js并沒有過多功能而是主要對前端程序的部署結(jié)構(gòu)作出約束,下面我們就來看一下JavaScript的模塊化開發(fā)框架Sea.js上手指南:2016-05-05前端JavaScript徹底弄懂函數(shù)柯里化curry
隨著主流JavaScript中函數(shù)式編程的迅速發(fā)展, 函數(shù)柯里化在許多應(yīng)用程序中已經(jīng)變得很普遍。 了解它們是什么,它們?nèi)绾喂ぷ饕约叭绾纬浞掷盟鼈兎浅V匾?。本篇文章小編九向大家詳?xì)介紹JavaScript函數(shù)柯里化,需要的小伙伴可以參考下面文字內(nèi)容2021-09-09JS前端以輕量fabric.js實現(xiàn)示例理解canvas
這篇文章主要為大家介紹了JS前端以輕量fabric.js實現(xiàn)示例理解canvas可視化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08解析JS參數(shù)parseInt('012',?16)和parseInt(012,?16)是否相等
這篇文章主要為大家介紹了parseInt('012',?16)和parseInt(012,?16)是否相等原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02微信小程序 常見問題總結(jié)(4058,40013)及解決辦法
這篇文章主要介紹了微信小程序 常見問題總結(jié)及解決辦法的相關(guān)資料,這里首先對微信小程序的結(jié)構(gòu)進(jìn)行了介紹,然后對常見問題進(jìn)行說明講解,需要的朋友可以參考下2017-01-01