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

时间:2014-04-21 15:44:06

标签: recursion erlang

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

2 个答案:

答案 0 :(得分:4)

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

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).

答案 1 :(得分:0)

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

当然,最恰当的方法是使用至少一个参数扩展递归函数定义以携带所有需要的数据。但是,如果你不能使用它,并且你确定只有一个这样的递归循环的实例会在一瞬间生效(或者它们将被正确堆叠),并且函数调用在同一个进程中,那么进程字典将会帮你。请参阅put()模块中的get()erlang,并创建用作密钥的唯一字词。但这绝对是一种黑客行为。

一个人可以发明更多的黑客,但所有这些都会很难看。:)