码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript中的递归

时间:2018-07-19 16:14:44      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:思路   经典   命名   function   console   lse   自身   var   turn   

 

 

 

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中的递归

标签:思路   经典   命名   function   console   lse   自身   var   turn   

原文地址:https://www.cnblogs.com/wyb666/p/9335931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!