美文网首页
递归和调用栈

递归和调用栈

作者: YQY_苑 | 来源:发表于2019-08-18 13:04 被阅读0次

递归

一个简单的递归阶乘

image.png
 j = (n) =>
      n === 1 ? 1
              : n * j(n-1)
image.png

斐波拉契数列

fib = (n) =>
    n === 0 ? 0 :
    n === 1 ? 1 :
    fib(n-1) + fib(n-2)
image.png

压栈/计算次数过高

image.png

如何降低压栈/计算次数

压栈:需要调用栈里记录“回到哪”

尾递归优化

用迭代替代递归

f = (n) => f_inner(2, n, 1, 0)

f_inner = (start, end, prev1, prev2) =>
    start === end ? prev1 + prev2 
    : f_inner(start +1 , end, prev1 + prev2, prev1)
image.png

尾递归的优势,可以不用“回头”,无需压栈

所有的递归都可以写成循环

f = (n) => {
  let array = [0, 1]
  for(let i = 0 ; i <= n - 2 ; i++){
    array[i+2] = array[i+1] + array[i]
  }
  return array[array.length -1]
}

记忆化函数

记录之前的结果,而不是记录调用的状态

image.png

React 优化

React 优化

image.png image.png
  • m没有变化
  • onClick就不需要重新执行
  • Child2就无须重新挂载,故Child也无需重新执行
const memo = (fn) => {
  const memoed = function(key) {
    if (!(key in memoed.cache)) {
      memoed.cache[key] = fn.apply(this, arguments)
        // 注意 memo 只会以第一个参数作为记忆点,但是还是会用 arguments 来调用 fn
    }
    return memoed.cache[key]
  }
  memoed.cache = {}
  return memoed
}

const x2 = memo((x) => {
    console.log('执行了一次')
    return x * 2
  })
  // 第一次调用 x2(1)
console.log(x2(1)) // 打印出执行了,并且返回2
  // 第二次调用 x2(1)
console.log(x2(1)) // 不打印执行,并且返回上次的结果2
  // 第三次调用 x2(1)
console.log(x2(1)) // 不打印执行,并且返回上次的结果2


// 执行结果

> "执行了一次"
> 2
> 2
> 2

相关文章

  • 第三章:递归

    递归 盒子里面找钥匙 基线条件和递归条件 栈 调用栈 调用另一个函数时,当前函数暂停并处于未完成的状态 递归调用栈...

  • 算法图解系列之递归[03]

    3 递归 3.1 递归<函数> 3.2 基线条件和递归条件 3.3 递归调用栈

  • 递归(recursion)

    基线条件(base case)&递归条件(recursive case) 递归条件基线条件 堆栈 调用栈 递归调用栈

  • 递归和调用栈

    递归 一个简单的递归阶乘 斐波拉契数列 压栈/计算次数过高 如何降低压栈/计算次数 压栈:需要调用栈里记录“回到哪...

  • 算法图解 (三)

    递归 基线条件指的是函数不再调用自己, 相当于一个出口; 递归条件指的是函数自己调用自己 栈 栈又称为栈或堆叠, ...

  • 记录不使用递归的斐波那契数列

    用普通的递归法会爆栈的原因是栈内存一般比较小, 而使用递归通常会向调用栈内加入大量的待调用函数, 超过调用栈的大小...

  • 2020-03-29

    对于二分查找,对比递归和非递归的执行效率,理解递归调用中,压栈和弹栈也是有时间开销的。 对模糊区间查找,随机查找,...

  • 递归&尾递归

    调用栈的特点,先进后出, FILO, 场景还原。 递归 有栈溢出的可能 stack overflow 尾递归 编译...

  • JVM_JMM: StackOverFlow栈溢出

    使用递归演示,自己调用自己导致栈空间溢出,递归和回溯。源代码:MyTest3.java 通过设置VMOption:...

  • c c++ java堆栈空间内存

    1.C中栈空间是十分有限的。 测试环境VS2015Window10函数的递归调用要依赖栈空间,这也导致递归调用次数...

网友评论

      本文标题:递归和调用栈

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