7

我来自函数式编程背景,首先考虑问题的递归解决方案而不是迭代解决方案。我开始使用 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]
4

1 回答 1

3

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

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

于 2014-03-05T03:44:34.267 回答