js 递归调用

程序员不止眼前的逻辑和代码,还有底层的框架与架构。

1. 前言

最近在做一个复杂表格设计数据格式设置,其中用到了多叉树的原理,所以要用到递归来实现数据格式化。

2. 递归的概念

在程序中函数直接或间接调用自己

注意:使用递归函数一定要注意,处理不当就会进入死循环。递归函数只有在特定的情况下使用 ,比如阶乘问题。

3. 例子

1. 一个阶乘的例子:

function fact(num) {
       if (num <= 1) {
                return 1;
       } else {
                return num * fact(num - 1);
       }
}
fact(3) // 结果为 6

以下代码可导致出错:

var anotherFact = fact; 
fact = null; 
alert(antherFact(4)); //出错 

由于fact已经不是函数了,所以出错。

使用arguments.callee arguments.callee 是一个指向正在执行的函数的指针,arguments.callee 返回正在被执行的对现象。 新的函数为:

function fact(num){ 
    if (num<=1){ 
        return 1; 
    }else{ 
        return num*arguments.callee(num-1); //此处更改了。 
    } 
} 
var anotherFact = fact; 
fact = null; 
alert(antherFact(4)); //结果为24. 

2.再看一个多叉树的例子:

先看图

多叉树.png 数据结构格式,参考如下代码:

headerData: {
                name: '总数据',
                children: [
                    {
                        name: '数据1',
                        children: [
                            {
                                name: '数据11',
                                children: [
                                    {
                                        name: '数据111',
                                    },
                                    {
                                        name: '数据112',
                                    }
                                ]
                            },
                            {
                                name: '数据12',
                                children: [
                                    {
                                        name: '数据121',
                                    },
                                    {
                                        name: '数据122',
                                    }
                                ]
                            },
                            {
                                name: '数据13',
                                children: [
                                    {
                                        name: '数据131',
                                    },
                                    {
                                        name: '数据132',
                                    }
                                ]
                            },
                            {
                                name: '数据14',
                            },

                        ]
                    }
                ]
            }

叶子结点 就是度为0的结点 就是没有孩子结点的结点 简单的说就是一个二叉树任意一个分支上的终端节点 我们如何获取节点的所有叶子节点个数呢? 递归代码如下:

/**
 * 获取 节点的所有 叶子节点 个数
 * @param {Object} json Object对象
 */
function getLeafCountTree(json) {
  if(!json.children){
      return 1;
  }else{
      var leafCount = 0;
      for(var i = 0 ; i < json.children.length ; i++){
          leafCount = leafCount + getLeafCountTree(json.children[i]);
      }
      return leafCount;
  }
}

最后

递归遍历是比较常用的方法,比如:省市区遍历成树、多叉树、阶乘等。 希望本文对你有点帮助。

本文分享自微信公众号 - 全栈修炼(BiaoChenXuYing),作者:xuying

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

原始发表时间:2018-07-30

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2019 前端秋季社招面试经历总结(二年多经验)

    推荐阅读:前端硬核面试专题[6],内容包含:HTML + CSS + JS + ES6 + Webpack + Vue + React + Node + HTT...

    夜尽天明
  • 浏览器之硬件加速机制

    而【WebKit 技术内幕】是基于 WebKit 的 Chromium 项目的讲解。

    夜尽天明
  • 56 道高频 JavaScript 与 ES6+ 的面试题及答案

    用正则表达式匹配字符串,以字母开头,后面是数字、字符串或者下划线,长度为 9 - 20

    夜尽天明
  • 【leetcode刷题】T193-各位相加

    https://leetcode-cn.com/problems/add-digits/

    木又AI帮
  • FastDFS+Nginx安装部署

    FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储、文件同步和文件访问,以及高容量和负载平衡。主要解决海量数据存储问题,特...

    用户5935336
  • Dubbo + RestEasy 实现文件上传与下载

    原文链接:https://blog.csdn.net/weixin_43057263/article/details/...

    微风-- 轻许--
  • ​特征工程系列:聚合特征构造以及转换特征构造

    关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~

    木东居士
  • ​特征工程系列:聚合特征构造以及转换特征构造

    关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~

    用户2769421
  • yolov3-python接口调用

    在YOLO官网提供的Darknet源码中,有一个使用python接口的示例程序 darknet.py 示例如下:https://github.com/pjre...

    py3study
  • 拓扑排序 ——个人理解,仅供参考

    贴代码: #include <bits/stdc++.h> using namespace std; #define maxn 100//可以根据题目条件进行更...

    Kindear

扫码关注云+社区

领取腾讯云代金券