`
yjl49
  • 浏览: 112926 次
社区版块
存档分类
最新评论

Erlang 尾递归

 
阅读更多

         尾递归就是在一系列语句的最后又跳转到被调用函数的开头。这里的“最后”两个字很关键,不正确的递归调用会吃光你的内存。

litaocheng 在他的blog中就提到过一个很好的例子:here

 

    观察下面的代码:

 

do_t1() ->
     try
         recive 
            _->
               do_t1()
         end
     catch
          _:_ ->
              do_t1()
     end.
 

    这段代码之所以不是尾递归是因为:在未抛出异常的情况下,函数中最后一个语句是try....catch 而不是 do_t1/0

    如果非要把以上代码改成尾递归,那么该怎么改呢?

 

   以下两段代码哪个正确?

do_t1() ->
     receive
         _ ->
           try

             do_t1()

           catch
               _:_ ->
                 do_t1()
           end
    end.

 

do_t1() ->
     receive
         _ ->
           try

             .......

           catch
               _:_ ->
                 do_t1()
           end,
           do_t1()
    end.

    如果要对原文中的以下代码进行改造(这里不考虑gen_server),那么应该如何修改?

send_msg(Socket, Pid) ->
   try
        receive
            {send, Bin} ->
                ...
            {inet_reply, _Sock, Result} ->
               ...
   catch
       _:_ ->
           send_msg(Sock, Pid)
   end.
 

    参考以下代码:

send_msg(Socket, Pid) ->
   Result= 
   try
        receive
            {send, Bin} ->
                ...
            {inet_reply, _Sock, Result} ->
               ...
   catch
       _:_ ->
           {error,"exception"}
   end,

   case Result of
       {error,_Er}->
          send_msg(Sock, Pid);
       Else->
            Else
   end
.
 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Efficiency Guide (erlang)

    实际上,Erlang编译器能够优化非尾递归调用,因此在许多情况下两者之间的性能差异并不显著。 ##### 1.2.4 误区:“++”操作符总是不好的 “++”操作符用于连接两个列表。虽然它创建了新列表而不是修改原列表,这在...

    Concurrent Programming in ERLANG (P1-90)

    常见的递归模式包括尾递归优化,这是一种特殊的递归形式,可以让递归调用在性能上接近迭代。 **3.5 函数式参数** 在Erlang中,可以将函数作为参数传递给另一个函数。这种能力允许编写高度灵活和可扩展的代码,例如...

    Concurrent Programming in ERLANG

    - 介绍几种常见的递归模式,如尾递归优化等。 - 尾递归优化可以提高递归函数的性能。 **3.5 函数式参数** - Erlang支持将函数作为参数传递给其他函数。 - 这一特性使得编写更灵活、可重用的代码成为可能。 ##### ...

    Eralng笔试题

    1. **尾递归实现** 使用了尾递归的方式进行迭代,每次只处理列表中的第一个元素,直到列表为空为止。 2. **使用 `lists:foldl/2` 实现** 是通过 `lists:foldl/2` 函数对列表中的每个元素应用函数,并累计结果。 ...

    erlang_term:Erlang术语信息

    例如,列表的尾递归优化可以减少内存使用。 10. **数据结构的使用**:在Erlang中,选择合适的数据结构对于实现高效算法至关重要。例如,元组适合快速查找,列表适合迭代和插入,二进制适合大数据处理。 通过理解...

    Erlang Reference Manual

    尾递归是一种特殊的递归形式,当函数的最后一次调用是自身时,则该函数称为尾递归函数。尾递归可以提高函数的性能,并减少栈空间的消耗。手册中详细解释了尾递归的概念、实现方法及其优势。 **1.5.4 内置函数(BIFs)...

    erlscripten:Erlang至PureScript转译器。 在浏览器中运行Erlang!

    多数erlang表达任意Arity函数模式匹配记录(通过元组) 二进制文件Lambdas 尾递归例外情况流程字典代码服务器,模块加载进出口商品兼容性实用程序常见错误( function_clause , case_clause , badarity等)部分...

    Erlang中遍历取出某个位置的最大值代码

    需要注意的是,Erlang中的列表操作基本上都是尾递归的,这是因为它在底层实现上是函数式的编程语言。尾递归是函数式编程的一个重要概念,它意味着在递归调用时,函数不需要保持当前的执行状态。这使得Erlang可以有效...

    erl_pfds:『Purely Functional Data Structures』中描述的数据结构的 Erlang 实现

    Okasaki的书中详细解释了如何通过尾递归优化来实现高效的操作,如append()和concat()。在Erlang中,我们可以利用其内置的列表函数,但理解底层原理有助于优化复杂操作。 2. **树(Trees)**:包括二叉树、红黑树等...

    99-Problems:著名的“函数式编程中的 99 个问题”的有效解决方案

    通过递归和尾递归,可以高效地对这些结构进行操作。 2. 高阶函数:Erlang中的高阶函数允许我们定义无副作用的函数,这在解决这些问题时至关重要。例如,`filter`、`reduce`和`map`等函数可以帮助我们简洁地表达算法...

    算法领域,快速排序(Quicksort),用于排列数据

    3. **尾递归优化**:对于较大的数组,可以先递归处理较大的子序列,再处理较小的子序列,这样可以避免栈溢出的问题。 #### 四、不同编程语言下的快速排序实现 快速排序的实现方法多样,不同的编程语言有不同的实现...

    函数与函数式编程

    7. **尾递归优化**:在某些函数式语言中,尾递归是指递归调用出现在函数体的最后,并且没有其他操作。编译器或解释器可以优化这种情况,避免栈溢出,使其等效于迭代。 8. **列表推导式**:一种简洁的创建新列表的...

    Algorithms A Functional Programming Approach

    函数式编程语言通常具有以下特点:不可变数据、高阶函数、尾递归优化、闭包和纯函数等。本书可能涵盖了以下的知识点: 1. 纯函数(Pure functions):纯函数是其输出仅由输入参数决定且不产生副作用的函数。在函数...

    Elixir编程入门

    - **尾递归优化**:Elixir支持尾递归优化,有助于提高性能。 ##### 2.9 枚举类型和流 - **枚举类型**:用于定义一系列枚举值。 - **流处理**:使用`Enum`模块提供的函数处理列表、数组等集合。 ##### 2.10 进程 ...

    简单介绍fp相关的资料

    尾递归优化是函数式语言中常见的优化技术,确保递归调用在函数末尾发生,从而避免无限栈的问题。 在实际开发中,函数式编程可以带来很多好处。例如,它可以帮助编写更简洁、清晰的代码,减少bug,提高代码的可读性...

    Functional Web Development With Elixir OTP and Phoenix

    例如,避免不必要的内存分配,利用尾递归等技巧减少内存消耗。 #### 总结 功能性网络开发涉及的技术栈Elixir、OTP以及Phoenix框架为构建高性能、高可用性的现代Web应用程序提供了强大的支持。通过对这些技术深入...

    Scala基础教程

    此外,Scala拥有强大的集合处理能力,对函数式编程的强大支持,例如高阶函数、尾递归优化和强大的模式匹配。这些特性都使得Scala在处理并发任务时,能够提供更简洁、更高效的代码。 了解和掌握Scala的基础知识可以...

    Python 学习文档

    函数式编程中常常使用的技术包括尾递归,这可以有效地优化递归调用的性能,避免堆栈溢出等问题。 #### 实体关系模型(ER模型) 实体关系模型是一种用于描述数据结构的概念模型。它通过实体(Entity)、属性...

Global site tag (gtag.js) - Google Analytics