专栏首页一路向前端javascript递归函数

javascript递归函数

递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数。

这句话理解起来并不难,从概念上出发,给出以下的例子:

function foo(){
    console.log("函数 foo 是递归函数。");
    foo();
}

这个例子的 foo 函数就是一个递归函数。

当你把这个函数拿到浏览器上运行的时候,你会发现内存溢出了,为什么呢?因为这个递归函数没有停止处理或运算的出口,因此 这个递归函数就演变为一个死循环。

那如何使用递归呢?

使用递归函数必须要符合两个条件:

1、 在每一次调用自己时,必须是(在某种意义上)更接近于解;

这句话怎么理解?

大家家里都有楼梯吧?比如从一楼走到二楼,那么我们的起点是一楼,目的地是二楼,当你往上每走一个台阶是不是越接近二楼,也就是越接近目的地。 因此这句话可以这样理解:函数每一次调用自己时,就越接近于我们期望它完成的任务的终点。

2、必须有一个终止处理或计算的出口。

这句话的意思是:必须要有一个标准的标志,让函数结束调用函数自身。 比如,怎么知道你已经走到二楼了呢?当你看到有个门,门牌上写着 2F 的,然后推开它跨过去,那么你就到二楼了。

用递归输出对象里包含的所有属性值(包括对象里的子孙对象):

var obj = {
    a:{
        name:"john",
        age:26,
        sex:"male",
        child:{
            firstChild:"mak",
            laseChild:"loy"
        }
    },

    b:{
        name:"joe", 
        age:28, 
        sex:"female", 
        child:{
            firstChild:"bill", 
            secondChild:"ruth", 
            laseChild:"yoki"
        }
    }
};

function getObjValue(obj){
    for(var k in obj){
        if(typeof obj[k] !== "object"){
            console.log(obj[k]); //递归出口
        }else{
            getObjValue(obj[k]); //函数调用函数自身
        }
    }
};

getObjValue(obj);

// 输出结果:
// name=john
// age=26
// sex=male
// firstChild=mak
// laseChild=loy
// name=joe
// age=28
// sex=female
// firstChild=bill
// secondChild=ruth
// laseChild=yoki

使用建议:在使用递归时,要注意对递归函数的参数类型的检查,一定要保证有一个终止处理或计算的出口。否则很容易演变为死循环,从而造成内存溢出。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CSS核心概念之盒子模型

    当对一个文档进行布局的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basic box model),将所有元素表示为一个个矩形的盒子。...

    用户6167509
  • 现代JavaScript函数库 usuallyjs 的安装和使用

    usuallyjs 是一个面向现代 Web 开发的 JavaScript 实用函数库。

    用户6167509
  • 体验usually.js的管道函数——pipe函数

    usually.js 是一个面向现代 Web 开发的 JavaScript 函数库,基于 ES6 开发。最新版本2.4.1,最新版本usually.js增加管道...

    用户6167509
  • 不同场景下使用CSS隐藏元素

    使用 CSS 让元素不可见的方法很多,剪裁、定位到屏幕外、明度变化等都是可以的。虽然它们都是肉眼不可见,但背后却在多个维度上都有差别。

    laixiangran
  • Oracle基本参数(SHARED_SERVERS)

    第一期就从基本的初始化参数讲起,一篇一个参数,会尽可能的具体. 如无特殊说明数据库版本为11.2.0.4

    bsbforever
  • 洛谷P1720 月落乌啼算钱

    目背景 (本道题目木有以藏歌曲……不用猜了……) 《爱与愁的故事第一弹·heartache》最终章。 吃完pizza,月落乌啼知道超出自己的预算了。为了不在爱与...

    attack
  • 机器学习14:模型评估与性能提升

    6.2,验证曲线、学习曲线、ROC曲线、准确度、精确率、召回率、F1_Score

    用户5473628
  • Linux Token Auth 一次性密码认证

    Linux Token Auth 一次性密码认证 摘要 服务器端脚本: https://github.com/oscm/devops/blob/master/b...

    netkiller old
  • 实现RTSP摄像机进行网页直播和微信直播的技术方案

    再小的技术点也会有他的市场! 一直以来,都有一些不被看好,认为是成本太高,无法大规模展开的软件和产品形态,就好比每一座城市都会有他的著名小吃一样,即使是慕名...

    EasyNVR
  • 谷歌教你学 AI-第六讲深度神经网络

    翻译/校对: Mika 本文为 CDA 数据分析师原创作品,转载需授权 Google Cloud发布了名为"AI Adventures"的系列视频,用简单易懂的...

    CDA数据分析师

扫码关注云+社区

领取腾讯云代金券