Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

js 递归调用 #9

Open
biaochenxuying opened this issue Sep 21, 2018 · 0 comments
Open

js 递归调用 #9

biaochenxuying opened this issue Sep 21, 2018 · 0 comments
Assignees
Labels
JavaScript JavaScript 相关知识点

Comments

@biaochenxuying
Copy link
Owner

biaochenxuying commented Sep 21, 2018

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

  1. 前言

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

  1. 递归的概念
    在程序中函数直接或间接调用自己

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

  1. 例子

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 biaochenxuying added the JavaScript JavaScript 相关知识点 label Sep 21, 2018
@biaochenxuying biaochenxuying self-assigned this Sep 21, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JavaScript JavaScript 相关知识点
Projects
None yet
Development

No branches or pull requests

1 participant