JavaScript中的遞歸
阿新 • • 發佈:2018-07-19
命名 思路 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種情況。
- 從n-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中的遞歸