JavaScript中的递归

Posted woz333333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中的递归相关的知识,希望对你有一定的参考价值。

 

 

 

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中的递归的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript - 代码片段,Snippets,Gist

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)

Node.js JavaScript 片段中的跳过代码

你可能不知道的JavaScript代码片段和技巧(下)

你可能不知道的JavaScript代码片段和技巧(上)

JavaScript中的递归