2019-12-1 seo達(dá)人
首先了解一下遞歸的定義:
遞歸:遞歸函數(shù)自己調(diào)用自己,且函數(shù)內(nèi)部必須有結(jié)束條件、否則就是一個(gè)死循環(huán);
遞歸案例:求 n 的階乘 (循環(huán) || 遞歸)
階乘公式先了解一下:
即n的階乘 = n(n-1)的階乘,如歸使用for循環(huán)來做這件事件就很簡(jiǎn)單:
//for循環(huán)
function fact(n) {
let end = 1;
for (var i = 1; i <= n; i++) {
end = i
}
return end
}
console.log(fact(5)) //5的階乘 120
再看看遞歸的做法:
//遞歸
function fact(n) {
if (n === 1) {
return 1 //結(jié)束條件
}
return n fact(n - 1) //此處的fact函數(shù)相當(dāng)于當(dāng)前隊(duì)列的階乘
}
console.log(fact(5)) //5的階乘
解析: 公式 n(n-1)! 則函數(shù)內(nèi)部只需要返回 n該函數(shù) n-1,
即 n(n-1)! == nfact(n-1)
看一下內(nèi)部隊(duì)列順序,當(dāng)形參為5時(shí) 階乘為 5 fact(n-1),直至形參n = 1時(shí),fact函數(shù)有了返回值 1,有了結(jié)束條件后整個(gè)函數(shù)結(jié)束自掉,返回階乘結(jié)果。
遞歸的優(yōu)點(diǎn):遞歸的實(shí)現(xiàn)明顯要比循環(huán)簡(jiǎn)單得多。
遞歸的缺點(diǎn):
1、效率低:遞歸由于是函數(shù)自己掉自己,而函數(shù)調(diào)用是有時(shí)間和空間的消耗的:每一次函數(shù)調(diào)用,都需要在內(nèi)存棧中分配空間以保存參數(shù)、返回地址以及臨時(shí)變量,而往棧中壓入數(shù)據(jù)和彈出數(shù)據(jù)都需要時(shí)間。
2、性能差:調(diào)用??赡軙?huì)溢出,每次函數(shù)調(diào)用會(huì)在內(nèi)存棧中分配空間,而每個(gè)進(jìn)程的棧的容量是有限的,當(dāng)調(diào)用的層次太多時(shí),就會(huì)超出棧的容量,從而導(dǎo)致棧溢出。
總結(jié):對(duì)于JavaScript而言,能用循環(huán)解決的事情、盡量不要考慮遞歸、 慎用!
藍(lán)藍(lán)設(shè)計(jì)的小編 http://m.820esy.cn