• 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

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

  • 相关阅读:
    Studio更新
    gradle 两种更新方法
    Handler基本用法
    使用git克隆指定分支的代码
    Bugly最简单的配置方法
    setTag,getTage复用
    Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
    Android应用如何跳转到应用市场详情页面
    bzoj千题计划249:bzoj5100: [POI2018]Plan metra
    bzoj千题计划248:bzoj3697: 采药人的路径
  • 原文地址:https://www.cnblogs.com/jofun/p/8727858.html
Copyright © 2020-2023  润新知