JS编程: 递归

1、什么是递归

递归就是一个函数调用自身,直到达到某个特定状态。

注意:使用递归函数一定要注意,处理不当就会进入死循环。

2、简单例子(阶乘)

function factorial(num) {
	if (num <= 1) {
		return 1;
	} else {
		return num*factorial(num-1);
	}
}

factorial(3);  // 结果为6

以下代码可能导致出错:

var anothorFactorial = factorial;
factorial = null;
alert(anothorFactorial(4)); // 出错

以上代码先把 factorial() 函数保存在变量 anothorFactorial 中,然后将 factorial 变量设置为 null,结果指向原始函数的引用只剩下一个。但在接下来调用 anothorFactorial() 时,由于必须执行 factorial(),而 factorial 已经不再是函数,所以就会导致错误。

使用 arguments.callee 解决
arguments.callee 是一个指向正在执行的函数的指针,arguments.callee 返回正在被执行的对象,因此可以用它来实现对函数的递归调用。

新的函数为:

function factorial(num) {
	if (num <= 1) {
		return 1;
	} else {
		return num*arguments.callee(num-1);
	}
}
var anothorFactorial = factorial;
factorial = null;
alert(anothorFactorial(4)); // 结果为24

3、应用递归

用递归的方法把 jsonArray 转成树形的 json 对象。

初始化数据:

var json = [
	{id:1,parent:0,name:'杭州市'},
    {id:2,parent:1,name:'余杭区'},
    {id:3,parent:1,name:'西湖区'},
    {id:4,parent:1,name:'滨江区'},
    {id:5,parent:0,name:'北京市'},
    {id:6,parent:5,name:'海淀区'},
    {id:7,parent:2,name:'高教路'}
];

递归方法:

function changeData(data, id) {
	const result = [];
    let temp = [];
    for (let i =0;i < data.length;i++) {
	    if (data[i].parent === id) {
	    	const obj = {'title': data[i].name,'children':temp};
	       	temp =this.changeData(data, data[i].id);
	        obj.children =temp
	        result.push(obj)
	     }
     }
     return result
}

调用输出:

console.log(changeData(json,0));

输出结果:
在这里插入图片描述

发布了17 篇原创文章 · 获赞 0 · 访问量 197

猜你喜欢

转载自blog.csdn.net/hy_ethel/article/details/103723678