JS遞歸實現階乘和菲波那切數列


當我們需要使用遞歸來完成某些操作的時候,我們先要了解什么是遞歸

什么是遞歸?

遞歸,就是在運行的過程中調用自己。

一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。

當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。

舉個例子:

1 function fun(){
2                 console.log(new Date())
3                 setTimeout(fun,1000)
4             }
5             fun()

第5行調用fun,fun內的一次定時器每隔1s再調用fun,在函數內部調用自己,這就是遞歸。

跟循環相同的是,遞歸是需要有邊界條件的,否則就變成了死循環。

遞歸-階乘

 

1 function fun(n){
2                 if(n == 1 || n == 0){
3                     return 1;
4                 }
5                 return n * arguments.callee(n-1)
6             }
7             console.log(fun(10))

 

設置了if語句為遞歸限制了邊界。

上面我運用了arguments.callee,那什么是arguments.callee呢?

arguments 的主要用途是保存函數參數, 但這個對象還有一個名叫 callee 的屬性,返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文,簡單點就是指代的就是這個函數的本身,這有利於匿名函數的遞歸或者保證函數的封裝性。

利用 callee 的屬性,返回正被執行的 Function 對象的方法,使得可以得到階乘的結果。

 

需要注意的是:

現在已經不推薦使用arguments.callee();

原因:訪問 arguments 是個很昂貴的操作,因為它是個很大的對象,每次遞歸調用時都需要重新創建。影響現代瀏覽器的性能,還會影響閉包。

當然第二種方法就是

1 function fun(n){
2                  if(n == 1 || n == 0){
3                      return 1;
4                  }
5                 return n * fun(n-1)
6             }
7             console.log(fun(10))

arguments.callee用fun取代,一樣可以實現遞歸的效果。

遞歸-菲波那切數列

菲波那切數列{1,1, 2, 3, 5, 8, 13, 21, 34 ...}

可理解為   fun(n) = fun(n-1) + fun(n-2)

當前的值等於前兩個數的和。

function fun(n){
                if(n == 1 || n == 2){
                    return 1;
                }
                return fun(n-1) + fun(n-2)
            }
            console.log(fun(9))

同樣為遞歸設置了邊界,輸出第9位的數值。

以上是個人對於遞歸的理解,歡迎廣大博友的指正和補充

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM