递归简介
一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
在JavaScript程序中,函数直接或间接调用自己。通过某个条件判断跳出结构,有了跳出才有结果。
递归的步骤(技巧)
1、假设递归函数已经写好
2、寻找递推关系
3、将递推关系的结构转换为递归体
4、将临界条件加入到递归体中(一定要加临界条件,某则陷入死循环,内存泄漏)
简单递归示例
// 1-100之间的数求和
// for循环写法
var sum = 0;
for(var i=1; i<=100; i++){
sum += i;
}
console.log(sum); // 5050
递归写法
分析:假设递归函数已经写好,既sum(100),就是求1-100的和。寻找递推关系: 就是 n 与 n-1 ,或 n-2 之间的关系:
sum(n) == sum(n-1) + n
varresulst=sum(100);varresulst=sum(99)+100;...
1、将递归结构转换成递归体
function sum(n){
return sum(n-1)+n;
}
这时候我们差一个重要的步骤,也就是临界值,来阻止程序死循环
2、将临界条件加入到递归中
求100 转换为 求99
求99 转换为 求98
求98 转换为 求97
…
求2 转换为 求1
求1 转换为 求1
即 sum(1) = 1
3、递归函数
functionsum(n){
if(n==1) return1;
returnsum(n-1)+n;
}
var amount = sum(100);
console.log(amount); // 5050
遍历树形结构的数据
var data = [
{
name:'第一代',
child:[
{
name:'第二代',
child:[
{
name:'第三代',
child:[ {......} ]
},
{
name:'第三代'
}
]
},
{name:'第二代'},
{name:'第二代'}]
}]
这样的数据结构,就需要一个递归函数来解决问题了,因为你不知道有多少个child,有多少层级在里面,可能是100,也可能是1亿,所以就递归直到没有child后来终止程序。