Recursion Rebol尾部调用优化

Recursion Rebol尾部调用优化,recursion,rebol,rebol3,tail-call-optimization,Recursion,Rebol,Rebol3,Tail Call Optimization,我来自函数式编程背景,首先考虑问题的递归解决方案,而不是迭代解决方案。我开始使用Rebol(特别是R3),并使用带累加器的尾部递归函数编写了primefactor kata的解决方案。但只要输入足够大,我就把堆栈炸了。我有一个Rebol2脚本,名为“tail func.r”,它实现了一个版本的tail调用优化,AFAIK还没有移植到R3。我知道REBOL3在很多情况下实现的东西与R2不同,所以有没有一种方法可以在REBOL3中获得TCO而无需任何额外代码?如果没有,是否有一种更简单的方法可以在不

我来自函数式编程背景,首先考虑问题的递归解决方案,而不是迭代解决方案。我开始使用Rebol(特别是R3),并使用带累加器的尾部递归函数编写了primefactor kata的解决方案。但只要输入足够大,我就把堆栈炸了。我有一个Rebol2脚本,名为“tail func.r”,它实现了一个版本的tail调用优化,AFAIK还没有移植到R3。我知道REBOL3在很多情况下实现的东西与R2不同,所以有没有一种方法可以在REBOL3中获得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]

对不起,没有密码就不行。Rebol是未编译的,因此无法提前知道尾部调用的确切组成部分。甚至对
return
函数的调用也会快速地(但不是通过goto)传播回调用堆栈


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

您能提供一个简单的代码片段作为示例吗?当然,我已经添加了我的primefactor实现示例。啊,未编译的部分很有意义。我习惯于至少进行一次优化的实现,通过代码,然后解释中间结果(或者继续生成机器代码)。