zoukankan      html  css  js  c++  java
  • 【递归】经典递归前端面试题

    /** 递归套路 总是两个相加 第一个+后面的所有
     *  优点: 代码更简洁
     *  缺点: 形成了闭包,递归层次太深时容易造成栈溢出
     *  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) + '	';
        }
        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) + '	';
            }
            arrNum += '
    ';
        }
        console.log(arrNum);
        return 0;
    };
    arrNumTable();
  • 相关阅读:
    ajax技术
    JSDOM获取子节点的一些方法
    防止a标签跳转的几种方法
    关于childNodes和children
    三种预览图片的方法
    异步加载js文件的方法
    跨域访问的解决方案
    关于在JS中设置标签属性
    Eclipse导入web项目发布项目时报Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web错误解决方案
    Maven构建项目报No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题的解决方案
  • 原文地址:https://www.cnblogs.com/mailyuan/p/13276323.html
Copyright © 2011-2022 走看看