1. 程式人生 > >JavaScript中的遞歸

JavaScript中的遞歸

命名 思路 urn 沒有 不是函數 argument The 表達式 n-1

JavaScript遞歸

1.遞歸定義

遞歸函數是在一個函數通過名字調用自身的情況下構成的,如下:

1 function factorial(num) {
2     if (num<=1){
3         return 1
4     }  
5     else{
6         return num * factorial(num-1)
7     }
8 }

上述函數表明上沒有任何問題,但是下面的代碼會導致它出錯:

1 var anotherFactorial = factorial
2 factorial = null
3 console.log(anotherFactorial(4))  // 出錯

出錯原因:factorial變量執行上述操作後為空,結果指向原始函數的引用就只剩下一個,但是在接下來的調用anotherFactorial中必須執行factorial,而factorial已經不是函數了,所以就導致錯誤出現,在這種情況下使用aruguments.callee可以解決這個問題

aruguments.callee:是一個指向函數的指針,因此可以用它來實現對函數的遞歸調用

 1 function factorial(num){
 2     if (num <= 1){
 3         return 1
 4     }
 5     else{
 6         return num*arguments.callee(num-1)
 7     }
 8 }
 9 
10 // 也可以用命名函數表達式實現和上面一樣的效果
11 var factorial = ( function f(num){
12     if (num <= 1){
13         return 1
14     }
15     else{
16         return num*f(num-1)
17     }
18 })

2.經典遞歸

一共10級樓梯,每次可以走一步或兩步,求一共多少種走法,思路:

要想走到N(N=10)級,可以分為2種情況。

  1. 從n-2級邁兩步
  2. 從n-1級邁一步

那麽對於n-2和n-1的情況也是各自分為兩種,以此類推。

那麽走法的和就是n-2的走法和n-1的走法之和。

那麽遞歸到最基本的(當前人在第0階臺階)

第0階臺階:0

第1階臺階:1

第2階臺階:2(1+1或者2)

得到公式,也就是斐波那契數列。

 1 var fib = function (n){
 2     if(n == 1){
 3         return 1;
 4     }
 5     else if(n==2){
 6         return 2;
 7     }
 8     else if(n>2){
 9         return fib(n-1) + fib(n-2);
10     }
11 }
12 
13 console.log(fib(10));

JavaScript中的遞歸