zoukankan      html  css  js  c++  java
  • js递归

    函数内部直接或间接调用函数本身为递归

    递归求阶乘

    function factorial(num) {
        // 0的阶乘等于1
        // 递归最重要的是明确递归结束条件,避免爆栈(RangeError: Maximum call stack size exceeded)
        if (num === 0) return 1;
        return num * factorial(num -1);
    }
    
    console.log(factorial(3)); // 6
    console.log(factorial(2)); // 2
    console.log(factorial(1)); // 1
    console.log(factorial(0)); // 1
    

    如果计算量特别大而导致爆栈,则可以使用尾递归,可惜的是除了Safari,其他的主流浏览器都还未能实现对尾递归的支持

    'use strict';
    // 按照规范, 只要使用了尾递归就不会发生栈溢出
    // 但必须在严格模式下运行代码
    
    function factorial(num, total = 1) {
        // 使用total累计计算结果
        if (num === 0) return total;
        // 所有的递归都必须再尾部调用, 不允许计算, 
        // return后面只能跟函数调用
        return factorial(num - 1, num * total);
    }
    
    console.log(factorial(3)); // 6
    console.log(factorial(2)); // 2 
    console.log(factorial(1)); // 1
    console.log(factorial(0)); // 1
    
    console.log(factorial(1000)); // Infinity
    // 暂不支持, 所以依旧溢出
    console.log(factorial(10000)); 
    // RangeError: Maximum call stack size exceeded
    

    使用递归简单模拟for循环

    function forLoop(arr, i, limit, fn) {
        (function inner(i) {
            if (i >= limit) return;
            fn(arr[i], i, arr);
            inner(++i);
        })(i);
    }
    
    const arr = [1, 3, 5, 2, 7, 8];
    
    const res = [];
    forLoop(arr, 0, arr.length, (val, idx, arr) => {
        res.push(val * 2);
    });
    
    console.log(res);
    // [ 2, 6, 10, 4, 14, 16 ]
    

    使用递归计算斐波那契数列

    // 计算第n个斐波那契数字
    function fib(n) {
        if (n === 0) return 0;
        if (n === 1) return 1;
        return fib(n - 1) + fib(n - 2);
    }
    
    // 获取前n个斐波那契数字
    function getAllFib(n) {
        const res = Array(n);
        for (let i = 0; i < n; i++) {
            res[i] = fib(i);
        }
        return res;
    }
    
    console.log(getAllFib(10));
    // [ 0, 1,  1,  2,  3, 5, 8, 13, 21, 34 ]
    
  • 相关阅读:
    hdu 思维风暴
    HDU 4183Pahom on Water(网络流之最大流)
    现在仍在工作的12名最“屌”的程序猿
    安卓ContentObserver模式获取短信用正则自己主动填充验证码
    Android插件实例——360 DroidPlugin具体解释
    mysql---union的使用方法
    SICP 习题 (2.11)解题总结:区间乘法的优化
    jQuery中的ajax
    Ajax的简单总结
    jQuery插件开发
  • 原文地址:https://www.cnblogs.com/hycstar/p/14373525.html
Copyright © 2011-2022 走看看