js递归函数——函数体内调用本函数的方式

时间: 2017-10-30阅读: 871标签: 递归

在js中通过如果一个函数直接或间接调用函数本身,则该函数称为递归函数。递归是一种思想:类似于我们的计数器,开闭原则。  递归的实质就是函数自己调用自己。  递归注意点:递归必须有跳出条件,否则是死循环。

我们采用内联函数来做说明,内联函数是指虽然在函数外没有声明变量f,但是在函数内部,是可以使用f()来调用自己的。

兔子序列(斐波那契数列 )
var f=function(n) {
    if(n<2){
        return n;
    }else{
      return f(n-1)+f(n-2);//调用自身函数实现递归
     }
}

console.log(f(5))值为5

阶乘递归函数  
var f=function(n){ 
    if (n<=1){ /*跳出条件*/
       return 1; 
    }else{ 
         return n*f(n-1);
    } 
}

 console.log(f(5)) 值为5*4*3*2*1=120

求n^m次方  
var f=function(a,b){
   if(b==0){
      return 1;
   }
   return f(a,b-1)*a;
}

console.log(f(2,5))值为32

求等差数列前几项的和 
var f=function(n) {
    if (n == 1){
       return 1;
    }
    return f(n - 1) + (2 * n - 1)
}

console.log(f(5))值为25

在操作递归时,递归会把自己参数中的值进行传递,直到我们传递的值达到我们设置的跳出条件时才会停止传递,而后面的公式指的是与我们需要得到的值进行的相对应操作,当我们写在函数中的值就相当于每一个传递的实参。

通过上面的方式实现效率非常低, 原因就在于, 需要反复调用函数自生, 且每次调用都有很多重复计算, 很明显, n越大, 调用次数越多.若是进行边界项复杂的函数,内存会大量浪费。

memoization优化递归

优化的思想通过定义一个数组,用来存放计算过的结果缓存起来, 这样就可以减少很多重复计算, 从而提高执行效率。代码如下

兔子序列(斐波那契数列 )  
var f=function(n){
    var cache=[];//定义一个空数组用来存放计算好的数据
  if((n==0)||(n==1)){
    return n;
  }else{

/*应用||或运算符“短路”的特性,若在数组中找到其值,则直接使用数组内的值,若没有,再进行计算,并将值存入数组*/

    cache[n-1]=cache[n-1]||fibonacci(n-1);     cache[n-2]=cache[n-2]||fibonacci(n-2);     return cache[n-1]+cache[n-2];//返回数组中的值   } }

完结~~~~~~


fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

广告合作文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯