zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Python 存储引擎 数据类型 主键
    Python 数据库
    Python 线程池进程池 异步回调 协程 IO模型
    Python GIL锁 死锁 递归锁 event事件 信号量
    Python 进程间通信 线程
    Python 计算机发展史 多道技术 进程 守护进程 孤儿和僵尸进程 互斥锁
    Python 异常及处理 文件上传事例 UDP socketserver模块
    Python socket 粘包问题 报头
    Django基础,Day7
    Django基础,Day6
  • 原文地址:https://www.cnblogs.com/jofun/p/8727858.html
Copyright © 2011-2022 走看看