- 一个函数在内部调用其本身,那么这个函数就是递归函数
- 递归函数一定要有跳出条件,否则就会形成死循环
- 最先调用的栈内存最后结束,最后调用的栈内存最先结束
- 基本格式
function fn() {
if () {
return
}
fn()
}
/**1. 一个函数在内部调用其本身,那么这个函数就是递归函数
2. 递归函数一定要有跳出条件,否则就会形成死循环
3. 最先调用的栈内存最后结束,最后调用的栈内存最先结束 */
function fn(n) {
if (n === 1) {
return 1
}
return n * fn(n - 1)
}
debugger
console.log(fn(5));
/**
* 上述递归执行时,会在window作用域内占用栈内存
* 计算fn(4)-> 占用fn(5)内存-> 占用fn(4)内存 -> 占用fn(3)内存 -> 占用fn(2)内存 -> 占用fn(1) 内存
* 内存回收时 fn(1)内存-> fn(2)内存 -> fn(3)内存 -> fn(4)内存 -> fn(5) 内存
* */
开启debugger查看调用栈(call stack)的占用释放
image.png
递归思想-数组扁平化(多层嵌套)
// 数组扁平化
let arr = [1, 1, [2, [3, 3, 4], 2], 1]
function ar(array) {
let newArr = []
for (let i = 0; i < array.length; i++) {
// 是否是数组
// 判断数据类型的四种方法
// typeof
// instanceof
// constructor
// Object.prototype.toString.call(x)
if (Object.prototype.toString.call(array[i]) === "[object Array]"){
newArr.push(...ar(array[i]))
} else {
newArr.push(array[i])
}
}
return newArr
}
console.log(ar(arr));
// 结果: 1, 1, 2, 3, 3, 4, 2, 1
补充:数组扁平化(多层嵌套)- flat(Infinity) 方法 效果同递归方法一样
// flat() ES6数组扁平化专用方法,可以带参表示层数
let arr = [1, 1, [2, [3, 3, 4], 2], 1]
console.log(arr.flat(Infinity));
// 结果: 1, 1, 2, 3, 3, 4, 2, 1
网友评论