美文网首页
递归核心思想

递归核心思想

作者: JX灬君 | 来源:发表于2021-07-18 20:02 被阅读0次
    1. 一个函数在内部调用其本身,那么这个函数就是递归函数
    2. 递归函数一定要有跳出条件,否则就会形成死循环
    3. 最先调用的栈内存最后结束,最后调用的栈内存最先结束
    • 基本格式
    function fn() {
      if () {
        return
      }
      fn()
    }
    
        /**1. 一个函数在内部调用其本身,那么这个函数就是递归函数
        2. 递归函数一定要有跳出条件,否则就会形成死循环
        3. 最先调用的栈内存最后结束,最后调用的栈内存最先结束 */
        function fn(n) {
          if (n === 1) {
            return 1
          }
          return n * fn(n - 1)
        }
        debugger
        console.log(fn(5));
    
        /**
         * 上述递归执行时,会在window作用域内占用栈内存
         * 计算fn(4)-> 占用fn(5)内存-> 占用fn(4)内存 -> 占用fn(3)内存 -> 占用fn(2)内存 -> 占用fn(1) 内存
         * 内存回收时 fn(1)内存-> fn(2)内存 -> fn(3)内存 -> fn(4)内存 -> fn(5) 内存
         * */
    
    

    开启debugger查看调用栈(call stack)的占用释放


    image.png

    递归思想-数组扁平化(多层嵌套)

    // 数组扁平化
        let arr = [1, 1, [2, [3, 3, 4], 2], 1]
        function ar(array) {
          let newArr = []
          for (let i = 0; i < array.length; i++) {
            // 是否是数组
            // 判断数据类型的四种方法
            // typeof
            // instanceof
            // constructor
            // Object.prototype.toString.call(x)
            if (Object.prototype.toString.call(array[i]) === "[object Array]"){
              newArr.push(...ar(array[i]))
            } else {
              newArr.push(array[i])
            }
          }
          return newArr
        }
        console.log(ar(arr));
    // 结果: 1, 1, 2, 3, 3, 4, 2, 1
    

    补充:数组扁平化(多层嵌套)- flat(Infinity) 方法 效果同递归方法一样

    // flat() ES6数组扁平化专用方法,可以带参表示层数
    let arr = [1, 1, [2, [3, 3, 4], 2], 1]
    console.log(arr.flat(Infinity));
    // 结果: 1, 1, 2, 3, 3, 4, 2, 1
    

    相关文章

      网友评论

          本文标题:递归核心思想

          本文链接:https://www.haomeiwen.com/subject/njuapltx.html