【算法初探】遞歸

前端也要懂算法,閱《算法圖解》有所得。

1、 遞歸

遞歸簡而言之就是函數調用本身。好比說咱們須要遍歷一個文件夾,有2種思路:前端

  1. 循環
  2. 遞歸

2種實現方式就不細說,算法

2、 基線條件和遞歸條件

假設咱們要寫一個倒計時:函數

var a = 5;

cutdown= function(i){
    i-=1
    cutdown(i)

}

cutdown(a);

沒錯,上面的代碼是個死循環。
每一個遞歸都須要有2個條件,一個是基線條件,用於控制遞歸啥時候暫停,一個是遞歸條件,控制調用本身的方式。下面咱們把倒計時函數改造一下:code

cutDown = function (i){
    if(i === 1 ){   //基線條件
        return
    } else {  //遞歸條件
        i-=1;
        cutDown(i)
    }
    
}

3、 棧

1. 調用棧

調用棧就是咱們調用一個函數的時候,計算機會單獨分配一個內存塊,用於存儲函數的參數和變量,而若是咱們調用多個函數,那麼就會被分配多個內存塊,每一個內存塊被壓入棧中,最早調用的被壓在最底層,而最後壓入的最早執行完被彈出。所以,咱們能夠得出結論:遞歸

  • 棧只有壓入和彈出2個操做
  • 棧的元素是先入後出的
  • 每個函數執行都會被分配一個內存塊
  • 同一個上下文的多個函數調用產生的內存塊會被壓入棧中。

2. 遞歸調用棧

遞歸的實現就是依賴棧的特性,好比咱們須要算5的階乘:內存

var func = function(i){
    if(i === 1){
        return 1;
    }else{
        return i*func(i-1);
    }

}


//執行 func(5)

//入棧
func(5);  //此時 i = 5 被壓入棧中

//通過基線條件和遞歸條件,func(5)暫停,func(4)執行

func(4) '// 此時 i = 4 被壓入棧中

...

func(1)

//出棧

func(1)  //執行完畢後,彈出, 返回 1

//上一個func(2)中的 func(i-1) 返回 1 

func(2) //返回 2X1= 2

...


func(5)
相關文章
相關標籤/搜索