recursion - erlang 如何处理混合尾递归的 case 语句

标签 recursion erlang case tail

假设我在这里有这个代码:

do_recv_loop(State) ->
    receive
    {do,Stuff} ->
        case Stuff of
        one_thing -> 
            do_one_thing(),
            do_recv_loop(State);
        another_thing ->
            do_another_thing(),
            do_recv_loop(State);
        _ ->
            im_dead_now
        end
    {die} -> im_dead_now;
    _ -> do_recv_loop(State)
    end.

现在,理论上这是尾递归的,因为对 do_recv_loop 的三个调用都不需要返回任何内容。但是 erlang 会认识到这是尾递归并适当优化吗?我担心嵌套结构可能使其无法识别它。

最佳答案

是的,它会。需要 Erlang 来优化尾调用,这显然是尾调用,因为调用函数后什么也没有发生。

我曾经希望有一个 tailcall Erlang 中的关键字,因此编译器可以警告我无效使用,但后来我习惯了。

关于recursion - erlang 如何处理混合尾递归的 case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5425929/

相关文章:

c++ - 递归填充动态大小 vector

mysql - 递归表

debugging - 使用 -compile 在 Erlang 模块中请求 debug_info

Erlang注册流程

swift - 为什么总值不随每个 switch case 更新? swift 4

带有某些 IF ELSE If ELSE 条件的 Mysql 查询

php - 如何比较mysql中一张表中具有相同值但效果不同的两个字段?

c# - 如何递归遍历嵌套泛型集合?

Python-将列表组合排列成各种大小的元组列表

erlang - 当我向 Erlang 中的已失效进程发送消息时会发生什么?