1,什么是递归函数:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
2,简单理解函数内部自己调用自己,这个函数就是递归函数
3,递归函数的作用和循环效果一样
死递归写法:
function fn() {fn();}fn();
一般写法:递归里面必须加退出条件
var num = 1;function fun() {console.log("打印5句话");if (num == 6) {return; //递归里面必须加退出条件}num++;fn();}fn();
利用递归函数求1-n的阶乘1*2*3*4*5*..n
function fn(n) {if (n == 1) {return 1;}return n * fn(n - 1)}console.log(fn(3)); // 6console.log(fn(4)); // 24//详细分析:假如用户输入的是3// return 3 * fn(3 - 1)// return 3 * fn(2)// return 3 * (2 * fn(1))// return 3 * (2 * 1)// return 3 * (2)// return 6
利用递归函数求斐波那契数列(兔子序列)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)); //2console.log(fb(6)); //8
利用递归遍历数据
data数组中有两个对象1与2,1中又有两个对象11与12
var data = [{id: 1,name: '家电',goods: [{ id: 11, name: '冰箱' }, { id: 12, name: '洗衣机' }]}, {id: 2,name: '服饰'}];
需求:我们想输入id号就可以拿到返回的数据对象
1,利用forEach 去遍历里面的每一个对象
function getID(json, id) {json.forEach(function (item) {// console.log(item); //2个数组元素if (item.id == id) {console.log(item);//2,我们想要得到里层的数据 11 12 可以用递归函数来做//里面要有goods这个数组并且数组的长度不为0} else if (item.goods && item.goods.length > 0) {getID(item.goods, id);}})}console.log(getID(data, 1));console.log(getID(data, 2));console.log(getID(data, 11));console.log(getID(data, 12));
根据上面的只是打印,现在要求数据返回给我们
var data = [{id: 1,name: '家电',goods: [{id: 11,name: '冰箱',goods: [{id: 111,name: '海尔冰箱'}, {id: 112,name: '美的洗衣机'}]}, {id: 12, name: '洗衣机'}]}, {id: 2, name: '服饰'}];//想输入id号就可以拿到返回的数据对象//1,利用forEach 去遍历里面的每一个对象function getID(json, id) {var o = {};json.forEach(function (item) {// console.log(item); //2个数组元素if (item.id == id) {// console.log(item); 不需要打印直接保存给o就可以了o = item//2,我们想要得到里层的数据 11 12 可以用递归函数来做//里面要有goods这个数组并且数组的长度不为0} else if (item.goods && item.goods.length > 0) {o = getID(item.goods, id);}});return o;}// getID(data, 1)// getID(data, 2)// getID(data, 11)// getID(data, 12)console.log(getID(data, 1));console.log(getID(data, 2));console.log(getID(data, 11));console.log(getID(data, 12));console.log(getID(data, 111));console.log(getID(data, 112));