# 13.递归
# 1.什么是递归?
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
function fn() {
fn() // 又调用了本身
}
fn()
递归函数的作用和循环效果一样
由于递归很容易发生“栈溢出”错误(stack overflow) , 所以必须要加退出条件return
let a = 0
function fn() {
console.log(a)
if(a === 6) {
return
}
a++
fn()
}
fn()
# 2.利用递归求数学题
1.求 1*2*3*4...*n阶乘
function factorial(num) {
if (num > 1) {
return num * factorial(num - 1)
} else {
return num
}
}
let result = factorial(10)
console.log(result)
2.用户输入一个数字 n 就可以求出 这个数字对应的兔子序列值
斐波那契数列(数字序列): 1、1、2、3、5、8、13、21...
// 规律
1 + 1 = 2
1 + 2 = 3
2 + 3 = 5
3 + 5 = 8
// 输入 n 获取第n位的值
// 获取 num 的前两项对应的值,就可以得到num对应的值
// num - 1 和 num - 1 - 1
function getFibonacci(num) {
if (num === 1 || num === 2) {
return 1
} else {
return getFibonacci(num - 1) + getFibonacci(num - 2)
}
}
console.log(getFibonacci(5))
# 3.利用递归遍历数据
根据ID号返回对应的数据对象
let data = [{
id: 1,
name: '家电',
goods: [{
id: 11,
gname: '冰箱'
},
{
id: 12,
gname: '洗衣机'
}
]
},
{
id: 2,
name: '服饰'
}
]
function getID(json, id) {
let obj = {}
json.forEach(function(item) {
// console.log(item)
if (item.id === id) {
obj = item
} else if (item.goods && item.goods.length > 0) {
// 判断是否有 goods,如果有,递归查询
obj = getID(item.goods, id)
}
})
return obj
}
console.log(getID(data, 11))
← 12.闭包 14.浅拷贝与深拷贝 →