/** 遞歸套路 總是兩個相加 第一個+后面的所有 * 優點: 代碼更簡潔 * 缺點: 形成了閉包,遞歸層次太深時容易造成棧溢出 * 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();