尾调用优化

// 不尾递归
function f(n) {
  if (n === 0 || n === 1) return n 
  else return f(n - 1) + f(n - 2)
}
// 尾递归,不爆栈
function fTail(n, a = 0, b = 1) {  
  if (n === 0) return a
  return fTail(n - 1, b, a + b)
}
// 递归转循环
function tailCallOptimize(f) {  
  let value
  let active = false
  const accumulated = []
  return function accumulator() {
    accumulated.push(arguments)
    if (!active) {
      active = true
      while (accumulated.length) {
        value = f.apply(this, accumulated.shift())
      }
      active = false
      return value
    }
  }
}

const f = tailCallOptimize(function(n, a = 0, b = 1) {  
  if (n === 0) return a
  return f(n - 1, b, a + b)
})
f(5) // return 5

参考链接

[参考链接]((https://www.ruanyifeng.com/blog/2015/04/tail-call.html)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 牛客剑指offer算法

    flytam
  • 两道笔试面试题目

    1、实现类似如下效果 Human(“Tam”) // log Tam .sleep(1000)// wait 1000 log sleep 1000 .s...

    flytam
  • electron-store在webpack打包中的Cannot find module "." 问题

    之前项目中遇到一个问题,使用了脚手架,并且引入了electron-store这个包。在开发模式下是能正常运行的,但是打包后却会包Cannot find modu...

    flytam
  • php封装的pdo数据库操作工具类与用法示例

    本文实例讲述了php封装的pdo数据库操作工具类与用法。分享给大家供大家参考,具体如下:

    砸漏
  • 职责链模式(Chain Of Responsibility)

    Java高级架构
  • JS导出页面table到Excel表格

    闻语博客
  • 使用Jasmine测试Angular Promises

    Jasmine provides a few more tools when dealing with promises. Consider the follo...

    javascript.shop
  • UiAutomator源码学习(2)-- UiAutomationBridge

    从上一章对UiDevice的学习,可以看出几乎所有的操作都离不开 UiAutomationBridge。重新看一下UIDevice的构造方法:

    yuanyuan
  • react结合redux实现一个购物车功能

    使用react开发有一段时间了,今天给大家带来一个案例,react结合redux实现购物车功能,页面如下:

    挥刀北上
  • 补习系列- springboot 整合 shiro一指禅

    Apache Shiro 是一个强大且易用的Java安全框架,用于实现身份认证、鉴权、会话管理及加密功能。 框架提供了非常简单且易于上手的API,可以支持快速为...

    美码师

扫码关注云+社区

领取腾讯云代金券