Rebol尾调用优化

时间:2014-03-05 03:22:53

标签: recursion rebol rebol3 tail-call-optimization

我来自函数式编程背景,首先考虑问题的递归解决方案而不是迭代解决方案。我开始使用Rebol(特别是R3),并使用带累加器的尾递归函数为primefactor 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]

1 个答案:

答案 0 :(得分:3)

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

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