/** 递归套路 总是两个相加 第一个+后面的所有 * 优点: 代码更简洁 * 缺点: 形成了闭包,递归层次太深时容易造成栈溢出 * 1. 根据题目搭架子,定义好入参、出参 * 2. 考虑并处理极端情况 * 3. 考虑正常情况(就是递归即函数调用自身) * **/ /**1. 拿一对刚出生的小兔子编故事。 假设,一对刚出生的小兔子,第一个月没有繁殖能力,两个月后生下一对兔子。 假设所有的兔子都不死,那么10月后有多少对兔子? 所经历的月数 1 2 3 4 5 6 7 8 9 10 兔子对数 1 1 2 3 5 8 13 21 34 55 // 斐波拉契数列 前两个数之和等于第三个数 6月兔子数量 = 5月数量 + 4月数量 **/ const fBArray = (month) => { if (month <= 2) { return 1; } return fBArray(month - 1) + fBArray(month - 2); }; console.log(fBArray(3)); /**2. 使用递归求和**/ let arr3 = [1, 2, 3]; let sumArr = (arr) => { if (!arr.length) { return 0; } else if (arr.length === 1) { return arr[0]; } else if (arr.length === 2) { return (arr[0] + arr[1]); } const newArr = arr.shift(); return (newArr + sumArr(arr)); }; console.log(arr3); console.log(sumArr(arr3)); console.log(arr3); /**3. 使用递归阶乘 4x3x2x1**/ let factNum = (num) => { if (!num) { return 0; } else if (num <= 2) { return num; } return num * factNum(num - 1); }; factNum(4); // 4. 将数组扁平化并去掉重复数据,最终得到一个降序且不重复的数组 let arr1 = [1, [3, 3, 4], [5, 6, 5, 6, 17, 7, [8, 9, [10, 11, [12, 13, 14, 18, 16, 18, [15]]]]], [16]]; let flatArr = (arr) => { let newArr = []; for (let i = 0; i < arr.length; i++) { if (arr[i] instanceof Array) { // newArr = [...newArr, ...flatArr(arr[i])] 第一步 扁平化得到一维数组 flatArr(arr[i]).forEach(item => { // 第二步 去重 !newArr.includes(item) && (newArr = [...newArr, item]); }) } else { newArr.indexOf(arr[i]) === -1 && (newArr = [...newArr, arr[i]]); } } return newArr.sort((a, b) => b - a); // 第三步 排序 }; console.log(flatArr(arr1)); // 5. 使用递归实现九九乘法表 let numTable = (num = 9) => { let resultNum = ''; if (num <= 0) { return num; } else if (num > 9 || num === 1) { return console.log(1 + ' * ' + num + ' = ' + num); } for (let i = 1; i <= num; i++) { resultNum += i + ' * ' + num + ' = ' + (i * num) + '\t'; } numTable(num - 1); console.log(resultNum); return 0; }; numTable(); // 普通乘法表 let arrNumTable = (num = 9) => { let arrNum = ''; for (let i = 1; i <= num; i++) { for (let j = 1; j <= i; j++) { arrNum += j + ' * ' + i + ' = ' + (i * j) + '\t'; } arrNum += '\n'; } console.log(arrNum); return 0; }; arrNumTable();