1. 程式人生 > >js實現遞迴,尾遞迴(遞迴優化),防止棧溢位

js實現遞迴,尾遞迴(遞迴優化),防止棧溢位

一、一版的遞迴實現 n!,比如 5!= 5 * 4 * 3 * 2 *1

      function fact(n) {

            if(n == 1) {

                   return 1;

            }else{

                    return n * fact(n-1)

           }

      }

      fact(10) //3628800;

     但這樣就會保持10條記錄,這樣很容易造成棧溢位;我們可以這樣理解,執行一個函式A,新增一個記錄A,在函式A中呼叫函式B,新增一個記錄B,等函式B執行完了之後,移除記錄B,把控制器交給A。因為遞迴就是函式裡面呼叫函式,所以會有10條記錄。

二、尾遞迴

       function fact(n) {

             return fact_iter(n,1)

       }

      function fact_iter(num, product){

               if(num == 1) {

                      return product;

                 }else{

                     return fact_iter(num-1, num * product);

              }

      }

      fact(10) //3628800;

     這樣就只儲存一條記錄,不會造成棧溢位。而這個為什麼只有一條記錄呢?這是因為函式fact_iter返回的是它本身,返回本身之後,它就不再需要控制器了(就是沒它什麼事了,它把任務交個了下家了),所以不會進棧,就不會有這條記錄。