如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。
简单理解:函数内部自己调用自己,这个函数就是递归函数。
递归函数的作用和循环效果一样
由于递归很容易发生 “栈溢出” 错误(stack overflow),所以必须要加退出条件 return。(return退出循环,退出递归)
var num = 1;
function fn() {
console.log('我要打印6句话');
if (num == 6) {
return; // 递归里面必须加退出条件
}
num++;
fn();
}
fn();
利用递归求数学题
// 利用递归函数求1~n的阶乘 1 * 2 * 3 * 4 * ...n
// 5的阶乘就是5×4×3×2×1
function fun(n) {
if (n == 1) {
return 1;
}
return n * fun(n-1);
}
console.log(fun(3)) // 6
console.log(fun(4)) // 24
console.log(fun(5)) // 120
// 利用递归函数求斐波那契数列(兔子序列)1、1、2、3、5、8、13、21...
// 用户输入一个数字 n 就可以求出这个数字对应的兔子序列值
// 我们只需要知道用户输入的 n 的前面两项(n-1 n-2)就可以计算出 n 对应的序列值
function fb(n) {
if (n === 1 || n === 2) {
return 1;
}
return fb(n-1) + fb(n-2)
}
console.log(fb(3)); // 2
console.log(fb(6)); // 8
利用递归求:根据id返回对应的数据对象
// 递归函数所需数据
let arr = [{
id: 1,
name: '家电',
subs: [{
id: 21,
name: '香蕉'
}, {
id: 22,
name: '苹果'
}]
}, {
id: 2,
name: '水果',
}]
// 利用递归函数获取对应ID的数据对象
getItem(data: any, id: number) {
let obj = {};
data.forEach(item => {
if (item.id === id) {
obj = item;
} else if (item.subs && item.subs.length > 0) {
obj = this.getItem(item.subs, id);
}
});
return obj;
}
// 利用递归函数获取对应ID的数据对象 调用
console.log(this.getItem(this.data, 1)); // {id: 1, name: '家电'}
console.log(this.getItem(this.data, 2)); // {id: 2, name: '水果'}
console.log(this.getItem(this.data, 21)); // {id: 21, name: '香蕉'}