美文网首页
JavaScript 函数式编程 - 蹦床,递归优化

JavaScript 函数式编程 - 蹦床,递归优化

作者: 惟允 | 来源:发表于2018-05-29 10:49 被阅读0次

Trampoline 解决 Blowing the stack

JavaScript 引擎没有对递归调用优化。因此,当运行下面的代码时:

const evenSteven = (n) => {
  if (n>0) {
    n = n - 1
    return evenSteven(n)
  }
  return 'over';
}

console.log(evenSteven(1000000))

会出现如下错误(blowing the stack):

RangeError: Maximum call stack size exceeded

要解决这个问题我们可以返回一个函数,它包装调用,而不是直接调用。

const evenSteven = (n) => {
  if (n > 0) {
    n = n - 1
    return () => {
      return evenSteven(n)
    }
  }
  return 'over';
}

console.log(evenSteven(0))
// over
console.log(evenSteven(1))
// [Function]
console.log(evenSteven(2))
// [Function]

这样,我们通过不断调用返回的函数就可以解决栈溢出的问题。

并且我们可以通过一个函数自动来进行 扁平化处理

const _ = require('lodash')

const trampoline = (func) => {
  let res = func()
  while (_.isFunction(res)) {
    res = res()
  }
  return res
}

console.log(trampoline(evenSteven(1000000)))
// over

由于调用链的间歇性,使用蹦床增加了递归开销。然而,慢总比栈溢出好。

我们还可以进行一次包装,将蹦床隐藏在内。

const func = (n) => {
  return trampoline(evenSteven(n))
}

相关文章

  • JavaScript 函数式编程 - 蹦床,递归优化

    Trampoline 解决 Blowing the stack JavaScript 引擎没有对递归调用优化。因此...

  • JavaScript函数式编程

    读完《JavaScript函数式编程》《JavaScript函数式编程指南》这两本书,对JavaScript函数式...

  • JavaScript函数式编程

    读完《JavaScript函数式编程》《JavaScript函数式编程指南》这两本书,对JavaScript函数式...

  • part1整理

    函数式编程:JavaScript函数式编程指南 异步编程:异步编程 Promise源码 JavaScript基础知...

  • Scheme学习笔记(一)——尾递归

    欢迎访问我的博客原文地址本文为SCIP课堂作业思考总结。 尾递归的定义 尾递归是函数式编程中,递归函数的一种优化手...

  • 函数式编程

    简单整理一下对函数式编程的理解和实践,本文包含函数式编程的概念、特性、合成、柯里化、尾调用、尾递归优化部分内容。 ...

  • Python 之路03 - Python基础3

    本节内容 函数与函数式编程 函数式编程之参数详解 局部变量与全局变量作用域嵌套函数 递归 函数式编程介绍 高阶函数...

  • 5.纯函数

    理解JavaScript纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式...

  • javascript函数式编程

    参考书籍:《javascript 函数式编程》 什么是函数式编程? 函数式编程通过函数将值转换为抽象单元,接着用于...

  • 【JavaScript】技术参考资料

    JS基础、高级、进阶 MDN·JavaScript 函数式编程 阮一峰老师的入门简介: 函数式编程初探、函数式编程...

网友评论

      本文标题:JavaScript 函数式编程 - 蹦床,递归优化

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