JavaScript遞歸詳述
一、什么是遞歸?
如果一個(gè)函數(shù)在內(nèi)部可以調(diào)用其本身,那么這個(gè)函數(shù)就是遞歸函數(shù)。簡(jiǎn)單理解:函數(shù)內(nèi)部自己調(diào)用自己, 這個(gè)函數(shù)就是遞歸函數(shù)。
如下所示:
function fn(){
fn();
}
fn();
這個(gè)函數(shù)就是一個(gè)遞歸函數(shù),當(dāng)我們直接打印時(shí),會(huì):

發(fā)現(xiàn)打印錯(cuò)誤,這是為什么呢?因?yàn)檫f歸函數(shù)的作用和循環(huán)效果一樣。當(dāng)沒(méi)有給他返回值的時(shí)候,它就會(huì)一直死循環(huán)下去。所以,我們知道了:
由于遞歸很容易發(fā)生“棧溢出”錯(cuò)誤(stack overflow),所以必須要加退出條件 return。
那正確的遞歸函數(shù)應(yīng)該怎樣寫呢?以上述代碼為例:比如我們現(xiàn)在要打印五遍‘你好’,這時(shí),我們應(yīng)該這樣來(lái)寫:
var num = 1;
function fn(){
console.log('你好');
if(num == 5){
return;
}
num++;
fn();
}
fn();
打印結(jié)果為:

知道了遞歸是什么,那我們?cè)賮?lái)看看如何利用遞歸解決問(wèn)題吧!
二、利用遞歸求數(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ù)列”,指的是這樣一個(gè)數(shù)列:、1、1、2、3、5、8、13、21、34、……,即第三項(xiàng)的值為前兩項(xiàng)的加和。用戶輸入一個(gè)n,就可以得到該位置的數(shù)。
代碼如下:
function fb(n){
if(n === 1 || n === 2){
return 1;
}
return fb(n-1) + fb(n-2);
}
console.log('第3項(xiàng)斐波那契數(shù)列值為:'+fb(3));
console.log('第10項(xiàng)斐波那契數(shù)列值為:'+fb(10));
打印結(jié)果為:

三、利用遞歸求對(duì)應(yīng)數(shù)據(jù)對(duì)象
根據(jù)id返回對(duì)應(yīng)的數(shù)據(jù)對(duì)象
有如下所示的對(duì)象:
var date = [{
id:1,
name:'電器',
goods:[{
id: 11,
gname:'手機(jī)'
},{
id: 12,
gname: '電腦'
}]
},{
id:2,
name:'服飾',
goods:[{
id : 21,
gname:'褲子'
},{
id : 22,
gname : '外套'
}]
},{
id : 3,
name: '食品'
}];
現(xiàn)在要通過(guò)輸入id返回對(duì)應(yīng)的數(shù)據(jù)對(duì)象。
首先我們可以通過(guò)for...Each()來(lái)遍歷數(shù)組,得到每一項(xiàng)值,如下所示:
function getId(array,id){
array.forEach(function(value){
console.log(value);
})
}
getId(date,1);
打印的結(jié)果為:

這時(shí),如果我們想要獲得id為1的對(duì)象的值,可以這樣操作:
function getId(array,id){
array.forEach(function(value){
if(value.id === id){
console.log(value);
}
})
}
getId(date,1);
打印結(jié)果為:

可以得到,但是如果我們想要得到id為11的對(duì)象的值呢?很明顯,直接調(diào)用該函數(shù)是不可行的,因?yàn)槲覀兺ㄟ^(guò)for...Each只是遍歷得到了最外層的對(duì)象的值,而內(nèi)層的具體分類并沒(méi)有得到,這時(shí),我們就可以通過(guò)遞歸調(diào)用getId(array,id)函數(shù),來(lái)獲取里層對(duì)象的值。
操作如下:
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序 選項(xiàng)卡的簡(jiǎn)單實(shí)例
這篇文章主要介紹了微信小程序 選項(xiàng)卡的簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
Javascript繼承(上)——對(duì)象構(gòu)建介紹
Javascript中除了基本數(shù)據(jù)(Undefined、Null、Boolean、Number、String),其他都是對(duì)象(Object)2012-11-11
Project?Reference優(yōu)化TypeScript編譯性能示例
這篇文章主要為大家介紹了Project?Reference優(yōu)化TypeScript編譯性能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
JS網(wǎng)頁(yè)repaint與reflow?的區(qū)別及優(yōu)化方式
這篇文章主要為大家介紹了JS網(wǎng)頁(yè)repaint與reflow?的區(qū)別及優(yōu)化方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

