在Erlang中,在函数的尾部递归实例之间维护状态的两种方法是什么



过程语言(例如Java)中的等价物是在循环外部声明的局部变量(或实例变量),循环的内容使用并更新它们。我怎么能在二郎做到这一点?

在递归调用中将状态作为参数传递。接收N条消息并将其作为列表返回的示例循环:

loop(N) ->
  loop(N, 0, []).
loop(N, Count, Msgs) when Count < N ->
   receive
      Msg -> loop(N, Count+1, [Msg|Msgs])
   end;
loop(_, _, Msgs)
    list:reverse(Msgs).

我希望这不是家庭作业题,但我对主题中的"两种方式"感到困惑。

当然,最合适的方法是用至少一个参数来扩展递归函数定义,以承载所有需要的数据。但是,如果你不能使用它,并且你确信这种递归循环的一个实例在一瞬间会生效(或者它们会被正确地堆叠),并且函数调用在同一个过程中,那么过程字典会帮助你。参见erlang模块中的put()get(),并发明唯一的术语用作密钥。但这绝对是一种黑客行为。

一个人可以发明更多的黑客,但所有这些都会很丑陋

最新更新