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.再看一个多叉树的例子:
先看图
数据结构格式,参考如下代码:
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', }, ] } ] }
我们如何获取节点的所有叶子节点个数呢? 递归代码如下:
/** * 获取 节点的所有 叶子节点 个数 * @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; } }