首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript改变递归函数,带trampoline版本

Javascript改变递归函数,带trampoline版本
EN

Stack Overflow用户
提问于 2017-12-23 09:08:00
回答 1查看 140关注 0票数 0

如何将以下代码更改为使用trampoline函数?谢谢。

代码语言:javascript
复制
var count = function (n) {
    if(typeof n !== 'number' || n % 1 !== 0) return null;
    if(n < 3) { return 1; }
    console.log(n)
    return count(n - 1) + count(n - 3)
}
EN

回答 1

Stack Overflow用户

发布于 2017-12-24 06:33:30

首先,我将count编写为一个纯表达式

代码语言:javascript
复制
const count = (n) =>
  n < 3
    ? 1
    : count (n - 1)
      + count (n - 3)

// demo
for (let n = 0; n < 10; n = n + 1)
  console.log (n, count (n))

然后,我将count转换为延续传递样式

代码语言:javascript
复制
const count = (n, k = x => x) =>
  n < 3
    ? k (1)
    : count (n - 1, x =>
        count (n - 3, y =>
          k (x + y)))

// demo
for (let n = 0; n < 10; n = n + 1)
  console.log (n, count (n))

现在count已经处于尾部位置了,我们可以很容易地将它放在一个弹床上--当然,你可以使用任何你想要的弹床实现

代码语言:javascript
复制
const countLoop = (n, k = x => x) =>
  n < 3
    ? k (1)
    : bounce (countLoop, n - 1, x =>
        bounce (countLoop, n - 3, y =>
          k (x + y)))

const count = (n) =>
  trampoline (countLoop (n))

const trampoline = (acc) =>
  {
    while (acc && acc.tag === bounce)
      acc = acc.f (...acc.values)
    return acc
  }

const bounce = (f, ...values) =>
  ({ tag: bounce, f, values })

// demo
for (let n = 0; n < 10; n = n + 1)
  console.log (n, count (n))

或者我们可以使用clojure风格的循环/递归弹床-我更喜欢这种风格,因为它确实需要一个辅助助手(即上面的countLoop )

代码语言:javascript
复制
const count = (m) =>
  loop ((n = m, k = x => x) =>
    n < 3
      ? k (1)
      : recur (n - 1, x =>
          recur (n - 3, y =>
            k (x + y))))

const loop = (f) =>
  {
    let acc = f ()
    while (acc && acc.tag === recur)
      acc = f (...acc.values)
    return acc
  }

const recur = (...values) =>
  ({ tag: recur, values })

// demo
for (let n = 0; n < 10; n = n + 1)
  console.log (n, count (n))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47948928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档