jS之递归及数组扁平化
简而言之,递归就是在函数内自己调用自己或者间接调用自己。
必要条件,递归必须要有出口,负责会造成栈溢出。(Uncaught RangeError: Maximum call stack size exceeded)
递归经典应用场景(斐波那契数列)
//斐波那契数列
//1,1,2,3,5,8,13,....
//求第n位数?
//根据已知数列可推导:
//第一位f(1) = 1;
//第二位f(2) = 1;
//第三位f(3) = f(3 - 1) + f(3 - 2);
//第四位f(4) = f(4 - 1) + f(4 - 2);
//第五位....
//以此类推可得:f(n) = f(n -1) +f(n -2);
function recursion(n){
if(n === 1 || n === 2)return 1;//递归出口
return recursion(n - 1) + recursion(n - 2);
}
console.log(recursion(n));//输出第n位
数组扁平化
//利用递归将多维数组扁平化
var arr = [1,2,[3,4],[5,[6,7],[8],9],10,11];
function flatFun(arr){
//定义一个新数组来保存扁平化后的数组
var newArr = [];
/**一个Map对象在迭代时会根据对象中元素的插入顺序来进行 一个一个
* for...of 循环在每次迭代后会返回一个形式为[key,value]的数组
*/
arr.map(item => {
//检测当前项是不是数组
if(item && Array.isArray(item)){
//如果是数组,通过递归调用重复以上步骤,并将最终递归返回的数组与新数组连接
newArr = newArr.concat(flatFun(item))
}else{
//如果该项不是数组,直接push到新数组里面去
newArr.push(item)
}
})
//最后返回新数组
return newArr;
}
console.log(flatFun(arr));//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]