递归

567 阅读1分钟

递归

概述

  • 递归:指在当前方法内调用自己的这种现象。
  • 递归的分类:
    • 递归分为两种,直接递归和间接递归。
    • 直接递归称为方法自身调用自己。
    • 间接递归可以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