递归
其实递归没有什么可解释的含义, 就是函数自己调用自己本身,或者在自己函数调用下的下级函数中调用自己。所有的递归都可以用来循环来实现。
简单看一下递归的求和
//可以看到这个数组套了4层,是比较复杂的结构
let arr = [100,200,300,[400,500,[49,59,80,[232,535,77]]]]
//声明初始值,用来保存求和后的总数
let bed = 0
function fn(arr){
//循环数组
arr.forEach((item) => {
// 判断数组中的每一项是否是数字类型,(准确来说是判断第一层,因为在正常业务逻辑中,我们是不指定数组的具体结构的,更不清楚数组到底嵌套了基层)
if(typeof item == "number"){
//遇到数字类型的值就累加求和 并返回出去
return bed+=item
}else{
//如果循环到了不是数字的,就重新调用自己,再进行循环。
fn(item)
}
})
}
fn(arr)
console.log(bed); //2532
再来看一个这样的数据结构
let arr1 = [
{
name: "张三",
money: 100,
children: [
{ name: "张欢欢", money: 200 },
{
name: "张乐乐",
money: 100,
children: [
{ name: "张小欢", money: 300 },
{ name: "张小乐", money: 400 },
],
},
],
},
{
name: "李四",
money: 100,
children: [
{ name: "李红红", money: 500 },
{ name: "李明明", money: 600 },
],
},
];
我们需要把所有 money 项累加起来
//设置总和初始值
let num = 0
function fn(arr){
//循环遍历数组
arr.forEach((item) => {
//从第一层开始遇到money就累加求和
num += item.money
//如果遇到有children就重新调用函数,对children项再进行循环
if(item.children){
fn(item.children)
}
})
}
fn(arr1)
console.log(num); //2300