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

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

在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];//返回数组中的值   } }

完结~~~~~~


吐血推荐

1.站长广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入...

2.休闲娱乐: 直播/交友    优惠券领取   网页游戏   H5游戏

链接: http://www.fly63.com/article/detial/29

vue依赖注入、递归组件的用法

在组件上面使用 ref 这个属性绑定,属性值自取,然后就可以通过 $refs.属性名 这种方式去获取到指定组件的实例了。其实不仅仅是组件能够使用 ref ,标签元素也能使用。

Js递归

传统的递归思想:自已调用自已,但是调用栈里面的执行上下文会越来越多,容易暴栈。采用尾递归可以规避这个问题:每次入栈出栈再入栈

Vue 和递归组件

有人说递归很难理解,也有人不这么认为。递归函数简单的定义是:一个自调用函数,这意味着它将在执行的某个时刻调用自己。从理论上讲,递归是一种需要两个属性的行为:

浅谈javascript中的递归和闭包

递归和闭包作为js中很重要的一环,几乎在前端的面试中都会涉及,特别闭包。今天前端组的组长冷不丁的问了我一下,粗略的回答了一下,感觉不太满足,于是重新学习了一下,写下本篇。

递归思想与实战

递归算法对于一个程序员应该算是最经典的算法之一,而且它越想越乱,很多复杂算法的实现也都用到了递归,例如深度优先搜索,二叉树遍历等。面试中常常会问递归相关的内容(深拷贝,对象格式化,数组拍平,走台阶问题等)

js递归实现方式

递归函数就是在函数体内调用本函数;递归函数的使用要注意函数终止条件避免死循环;递归实现形式:1.声明一个具名函数,通过函数名调用,2. 使用arguments.callee代替函数名

递归算法的理解

所谓递归,就是既有传递,又有回归,与其说是传递与回归,初学不如理解是一种 “循序递进”与“规律约束”。为什么这样说,因为递归算法相比较于循环在代码结构方面个人认为更加简洁清晰,清晰易懂,递归注重的是一种有序的规律

js利用递归与promise 按顺序请求数据

项目中有一个需求,一个tabBar下面如果没有内容就不让该tabBar显示,当然至于有没有内容,需要我们通过请求的来判断,但是由于请求是异步的,如何让请求按照tabBar的顺序进行?

JS递归及二叉搜索树的移除节点

递归含义:在某时某刻某个条件下调用包含自己的函数;注意点:⑴递归过程中一定要加限制条件,要不然会陷入死循环:递归有个过程,不是一步到位的,这一点尤其重要

递归获取页面元素的真实offsetLeft和offsetTop

由于父元素的定位属性, 导致子元素及其孙元素等的offsetLeft和offsetTop变得和预期不一致(预期上都是到屏幕左边和上边的位置), 由于需要做鼠标拖动旋转和鼠标框选

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

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

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全