递归
概述
- 递归:指在当前方法内调用自己的这种现象。
- 递归的分类:
- 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
- 注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归
递归的使用前提
- 当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归
小案例
递归累加求和
//求和
function fn(n) {
if (n == 1) return 1
return n + fn(n - 1)
}
let sum = fn(10)
console.log(sum) // 55
递归求阶乘
// 阶乘
function f(n) {
if (n < 1) return 1
return n * f(n - 1)
}
let num = f(5)
console.log(num) //120
递归数组
let arr = [10, 20, 30, [40, 50, [1, 2, 3, [4, 5, 6, 7]]]]
let total = 0
function deepClone(arr) {
arr.forEach((item) => {
if (typeof item === 'number') {
total += item
} else {
deepClone(item)
}
})
}
deepClone(arr)
console.log(total) // 178
复杂数组
let arr1 = [
{
id: 1001,
name: '水果',
price: 10,
children: [
{ id: 10, name: '香蕉', price: 20 },
{ id: 10, name: '香蕉', price: 20 },
{ id: 10, name: '香蕉', price: 20 },
],
},
{
id: 1001,
name: '水果',
price: 10,
children: [
{ id: 10, name: '香蕉', price: 20 },
{ id: 10, name: '香蕉', price: 20 },
{ id: 10, name: '香蕉', price: 20 },
],
},
]
let total = 0
function getNum(arr1) {
arr1.forEach((item) => {
if (typeof item.children === 'object') {
getNum(item.children)
} else {
total += item.price
}
})
}
getNum(arr1)
console.log(total) // 120