# 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))

更新时间: 7/10/2021, 3:24:04 PM