JavaScript递归

递归的定义很简单,就是在函数体内调用本函数。递归对于解决一些算法问题有很大的优势,但是递归必须慎重使用,递归函数如果判断条件无法终止,很容易造成内存溢出,报错stack overflow,使程序崩溃。

递归最经典例子,阶乘:

阶乘就是1*2*3*4*5......

计算阶乘的函数factorial:

function  factorial(num) { 
   if (num == 0) { 
      return 1; 
   };
   return num * factorial(num - 1);
}

我们分享过调用栈了,当我们调用factorial(5)的时候,函数运行过程中需要缓存变量,从5一直到2。这对内存使用会比较多。所以有些函数可以处理成尾递归:

function factorial (n, total = 1) { 
   if(n == 1){ 
       return total; 
   } 
    return factorial(n-1, n * total);
}

这样每次都是执行函数,不需要缓存局部变量。

斐波那契数列:

斐波那契数列指的是1、1、2、3、5、8……这样的数列,数学应该都学过,可以推导出公式:F(n) = F(n-1) + F(n-2),且参数大于3。

function fn(n) { 
   if (n < 3) { 
       return 1; // 递归终止条件 
  } 
  return fn(n - 1) + fn(n - 2);
}

通过调用栈知道,这会形成非常多的调用栈,其实并不推荐使用递归算斐波那契数列,使用循环会是更好的选择。

递归在开发业务过程中基本很难用上,不可能让你写个阶乘写个斐波那契数列。之前水群的时候有人问了个问题:

上面打印orderId明明不一样的, 但是放在下面的循环 结果都一样了?

像这种场景下就可以使用递归,因为请求是异步的,当你成功的时候i可能已经循环到了最后了,这时候在成功回调里面使用递归就能很好解决这个问题。

其他的具体业务使用场景还真的没有很多想法,这边再提一嘴,慎重使用递归,递归总结条件一定要很清晰,递归很容易内存溢出。

(完)

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript内存之栈和堆

    对于前端来说,平时开发业务代码的时候根本不会关心JavaScript的内存问题,因为根本用不到,也因此对于内存分配没有一点概念。只有理解了内存分配,对于深拷贝和...

    wade
  • 哔哩哔哩开源的flvjs

    之前有分享过rtmp和m3u8的直播,后来才有了哔哩哔哩开源的flvjs做,于是就出现了ios不兼容的问题。

    wade
  • node乞丐版require方法

    在node环境中,每一个文件都是一个模块,解决了命名冲突的问题,node会默认给js加上一个函数,比如一个js文件打印this:

    wade
  • 基本算法之-递归

    俗话说,大事化小。递归算法也是分治的思想。我国古代的愚公移山,就是这种递归。子又生孙,孙又生子。

    赵云龙龙
  • 程序员必备的基本算法:递归详解

    递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它。在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法。它太基础太重要...

    公众号C语言与CPP编程
  • 死磕程序员必备算法:递归!

    递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它。在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法。它太基础太重要...

    五分钟学算法
  • 大家都知道递归,尾递归呢?什么又是尾递归优化?

    今天,我们来聊聊递归函数。为啥突然想到递归?其实就从电影名字《恐怖游轮》《盗梦空间》想到了。

    程序猿石头
  • 数据结构与算法学习笔记之高效、简洁的编码技巧“递归”

    盗梦空间想象大多数人都看过:电影讲述的是主人公诺兰进入希里安·墨菲梦境植入想法的行动。为了向希里安·墨菲梦植入理念,影片进入四层梦境,即所谓:“梦中的梦中 梦中...

    Dawnzhang
  • 数据结构与算法-递归

    本文为王争老师在『极客时间』中的课程《数据结构与算法之美》的学习笔记,想要学习原文的同学购买相关课程学习。如有侵权请联系作者删除。

    用户3470542
  • JAVA面试50讲之7:ConcurrentHashMap如何高效实现线程安全

    Java提供了不同层面的线程安全支持。 在传统集合框架内部,除了Hashtable等同步容器 还提供了所谓的同步包装器(Synchronized Wrapper...

    用户1205080

扫码关注云+社区

领取腾讯云代金券