<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          JavaScript之遞歸 詳解!

          2019-12-1    seo達人

          首先了解一下遞歸的定義:



          遞歸:遞歸函數自己調用自己,且函數內部必須有結束條件、否則就是一個死循環;



           遞歸案例:求 n 的階乘 (循環 || 遞歸)



          階乘公式先了解一下:







          即n的階乘 =  n(n-1)的階乘,如歸使用for循環來做這件事件就很簡單:



              //for循環

              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 //結束條件

                  }

                  return n fact(n - 1) //此處的fact函數相當于當前隊列的階乘

              }

              console.log(fact(5)) //5的階乘

          解析: 公式 n
          (n-1)!  則函數內部只需要返回 n該函數 n-1,



          即 n
          (n-1)!  == nfact(n-1)  







           看一下內部隊列順序,當形參為5時 階乘為 5
          fact(n-1),直至形參n = 1時,fact函數有了返回值 1,有了結束條件后整個函數結束自掉,返回階乘結果。



          遞歸的優點:遞歸的實現明顯要比循環簡單得多。



          遞歸的缺點:



          1、效率低:遞歸由于是函數自己掉自己,而函數調用是有時間和空間的消耗的:每一次函數調用,都需要在內存棧中分配空間以保存參數、返回地址以及臨時變量,而往棧中壓入數據和彈出數據都需要時間。



          2、性能差:調用??赡軙绯?,每次函數調用會在內存棧中分配空間,而每個進程的棧的容量是有限的,當調用的層次太多時,就會超出棧的容量,從而導致棧溢出。 



          總結:對于JavaScript而言,能用循環解決的事情、盡量不要考慮遞歸、 慎用! 


          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合