【遞歸】經典遞歸前端面試題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM