【问题标题】:Rebol Tail Call OptimizationRebol 尾调用优化
【发布时间】:2014-04-06 22:14:18
【问题描述】:

我来自函数式编程背景,首先考虑问题的递归解决方案而不是迭代解决方案。我开始使用 Rebol(特别是 R3),并使用带有累加器的尾递归函数编写了质数因子 kata 的解决方案。但是对于任何足够大的输入,我都会破坏堆栈。我有一个名为“tail-func.r”的 Rebol2 脚本,它实现了 AFAIK 尚未移植到 R3 的尾调用优化版本。我知道 Rebol 3 在许多情况下实现的东西与 R2 不同,那么有没有办法在 Rebol 3 中获得 TCO 而无需任何额外代码?如果没有,有没有更简单的方法可以在不移植旧脚本的情况下获得它?

编辑添加我的代码:

primefactors: function [n m factors] [
  either n > 1
    [ either (modulo n m) == 0
      [ primefactors (n / m) m (append factors m) ]
      [ primefactors n (m + 1) factors ] ]
    [ factors ]
  ]

  primefactors 30 2 (copy []) => [2 3 5]

【问题讨论】:

  • 你能提供一个简单的sn-p代码作为例子吗?
  • 当然,我已经添加了我的示例素因子实现。

标签: recursion rebol rebol3 tail-call-optimization


【解决方案1】:

没有代码,抱歉。 Rebol 没有被编译,所以没有办法提前知道到底是什么构成了尾调用。甚至对 return 函数的调用也会快速传播回调用堆栈,但不是通过 goto。

IIRC tail-func 的作者现在在 Rebol 3 上工作,无论他是否这样做应该很容易移植。既然你提到它,我会看看。函数生成器和预处理器在 Rebol 中很容易实现。

【讨论】:

  • 啊,未编译的部分是有道理的。我习惯于通过代码进行至少一个优化然后解释中间结果(或继续生成机器代码)的实现。
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 2011-07-11
  • 2015-04-23
  • 2013-06-20
  • 1970-01-01
  • 2012-08-19
  • 2011-05-27
  • 2019-04-20
相关资源
最近更新 更多