- 递归的本质就是函数内部调用本函数。
- 要避免递归出现死循环,一定要有一个结束标志(临界条件)。
- 一定要搞清楚递归的关系。
-
递归可以将复杂/抽象的问题简单化。
下面通过一些例子好好的感受一下吧
1、求1-100的和
/*
分析:1-100的和就是1+2+3+4+..+100
1-100的和等于1-99的和+100
1-99的和等于1-98的和+99
1-98的和等于1-97的和+98
...
1的和等于1
*/
// sum函数的意思是获取1+2+3+..+n的和
function sum(n) {
// 结束条件
if (n == 1) {
return 1
} else {
return sum(n - 1) + n
}
}
console.log(sum(100)) // 5050
2、斐波那契数列
示例:0 1 1 2 3 5 8 13 21…
/*
分析:
第一位是0
第二位是1
第三位等于第二位+第一位
第四位等于第三位+第二位
那么以此类推
第n位就是第(n-1)位+(n-2)位的和
第一位第二位就是临界值
*/
function fn(n) {
if (n == 1) {
return 0
}
else if (n == 2) {
return 1
} else {
return fn(n - 2) + fn(n - 1)
}
}
console.log(fn(8)) // 13
console.log(fn(20)) // 4181
3、计算n的阶乘
数学公式:n!=1×2×3×…×(n-1)×n
/*
分析:
1! = 1
2! = 1!*2
3!=2!*3
以此类推
n!=(n-1)!*n
*/
function fn(n) {
// 结束条件
if(n==1) {
return 1
}else {
// 递归关系
return fn(n-1)*n
}
}
console.log(fn(3)) // 6
console.log(fn(10)) // 3628800
4、递归遍历JSON树
// 获取某个id的name属性值
var arr = [
{
id: 1,
name: '理科',
children: [
{
id: 3,
name: '数学',
children: [
{
id: 9,
name: '线性代数'
},
{
id: 10,
name: '高数'
}
]
},
{
id: 4,
name: '物理'
},
{
id: 5,
name: '化学'
},
{
id: 6,
name: '生物'
}
]
},
{
id: 2,
name: '文科',
children: [
{
id: 7,
name: '语文'
},
{
id: 8,
name: '英语'
}
]
}
]
function fn(data, id) {
for (let i = 0; i < data.length; i++) {
if (data[i].id == id) {
return data[i].name
}
if (data[i].children) {
return fn(data[i].children, id)
}
}
}
arr.map(item => {
let res = fn([item], 7)
if (res) {
console.log(res) // 语文
}
})