JS --- 递归函数

mac2022-06-30  80

函数内部调用自己,就是递归函数 注意:一定要加退出条件,不然就会死循环

var num = 1; function fn(){ console.log("打印递归函数") if(num == 6){ return; } num++; fn(); } fn();

例一:利用递归求1~n的阶乘1 * 2 * 3 * 4 * …n

function fn(n){ if(n == 1){ return 1; } return n * fn(n - 1); } console.log(fn(5))

此代码如果拆开解析就是,可以看到fn()函数多次自己调用自己,直到条件满足

function fn(n){ if(n == 1){ return 1; } return n * fn(n - 1); } console.log(fn(5)) // 此递归函数进行的过程如下 return 5 * fn(5-1) return 5 * fn(4) return 5 * (4 * fn(4-1)) return 5 * (4 * fn(3)) return 5 * (4 * (3 * fn(3-1))) return 5 * (4 * (3 * fn(2))) return 5 * (4 * (3 * (2 * fn(2-1))) return 5 * (4 * (3 * (2 * fn(1))) return 5 * (4 * (3 * (2 * 1))

例二:利用递归函数查找对应商品

var jsondata = [ { id:1, name:"家电", goods:[ { id:11, gname:"冰箱", goods:[ { id:111, gname:"海尔" }, { id:112, gname:"美的" } ] }, { id:12, gname:"洗衣机" } ] }, { id:2, name:"服饰" } ] // 一个函数,接收传递的参数,获取数据 function getdata(json,id){ // 变量o,用来存储获取到的数据 var o = {}; // 利用forEach遍历数据,item为遍历出来的数据 json.forEach(function(item){ // 如果传递的商品id和遍历出来的商品id一样,则将该对应的商品数据拿到 if(item.id == id){ o = item; // 如果传递的商品id和遍历出来的商品id不一样,则从里层的数组goods里继续查找 // 所以利用递归函数再次调用getdata()函数本身,遍历数据 // 此时遍历的数据则是item.goods这个数组的数据,也就是说getdata()函数的json参数是item.goods里面的数据 }else if(item.goods && item.goods.length > 0){ o = getdata(item.goods,id); } }); // 最终将拿到的数据返回 return o; }

此时,如果调用函数并且传递id为1时

console.log(getdata(jsondata,1))

如果传递参数id为11时,则和上面的结果不一样,会查到里层的数据

console.log(getdata(jsondata,11))

再深一层,传递id为112

console.log(getdata(jsondata,112))

最新回复(0)