尾递归就是在一系列语句的最后又跳转到被调用函数的开头。这里的“最后”两个字很关键,不正确的递归调用会吃光你的内存。
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
.
分享到:
相关推荐
实际上,Erlang编译器能够优化非尾递归调用,因此在许多情况下两者之间的性能差异并不显著。 ##### 1.2.4 误区:“++”操作符总是不好的 “++”操作符用于连接两个列表。虽然它创建了新列表而不是修改原列表,这在...
常见的递归模式包括尾递归优化,这是一种特殊的递归形式,可以让递归调用在性能上接近迭代。 **3.5 函数式参数** 在Erlang中,可以将函数作为参数传递给另一个函数。这种能力允许编写高度灵活和可扩展的代码,例如...
- 介绍几种常见的递归模式,如尾递归优化等。 - 尾递归优化可以提高递归函数的性能。 **3.5 函数式参数** - Erlang支持将函数作为参数传递给其他函数。 - 这一特性使得编写更灵活、可重用的代码成为可能。 ##### ...
1. **尾递归实现** 使用了尾递归的方式进行迭代,每次只处理列表中的第一个元素,直到列表为空为止。 2. **使用 `lists:foldl/2` 实现** 是通过 `lists:foldl/2` 函数对列表中的每个元素应用函数,并累计结果。 ...
- **高级用法**: 如递归、尾调用优化等。 - **If 和 Case**: - **If 语句**: 类似于其他编程语言的 if 语句,但在Erlang中,它是表达式的一部分。 - **Case 语句**: 更强大的模式匹配机制,可用于复杂的分支逻辑...
例如,列表的尾递归优化可以减少内存使用。 10. **数据结构的使用**:在Erlang中,选择合适的数据结构对于实现高效算法至关重要。例如,元组适合快速查找,列表适合迭代和插入,二进制适合大数据处理。 通过理解...
尾递归是一种特殊的递归形式,当函数的最后一次调用是自身时,则该函数称为尾递归函数。尾递归可以提高函数的性能,并减少栈空间的消耗。手册中详细解释了尾递归的概念、实现方法及其优势。 **1.5.4 内置函数(BIFs)...
多数erlang表达任意Arity函数模式匹配记录(通过元组) 二进制文件Lambdas 尾递归例外情况流程字典代码服务器,模块加载进出口商品兼容性实用程序常见错误( function_clause , case_clause , badarity等)部分...
需要注意的是,Erlang中的列表操作基本上都是尾递归的,这是因为它在底层实现上是函数式的编程语言。尾递归是函数式编程的一个重要概念,它意味着在递归调用时,函数不需要保持当前的执行状态。这使得Erlang可以有效...
Okasaki的书中详细解释了如何通过尾递归优化来实现高效的操作,如append()和concat()。在Erlang中,我们可以利用其内置的列表函数,但理解底层原理有助于优化复杂操作。 2. **树(Trees)**:包括二叉树、红黑树等...
通过递归和尾递归,可以高效地对这些结构进行操作。 2. 高阶函数:Erlang中的高阶函数允许我们定义无副作用的函数,这在解决这些问题时至关重要。例如,`filter`、`reduce`和`map`等函数可以帮助我们简洁地表达算法...
3. **尾递归优化**:对于较大的数组,可以先递归处理较大的子序列,再处理较小的子序列,这样可以避免栈溢出的问题。 #### 四、不同编程语言下的快速排序实现 快速排序的实现方法多样,不同的编程语言有不同的实现...
7. **尾递归优化**:在某些函数式语言中,尾递归是指递归调用出现在函数体的最后,并且没有其他操作。编译器或解释器可以优化这种情况,避免栈溢出,使其等效于迭代。 8. **列表推导式**:一种简洁的创建新列表的...
函数式编程语言通常具有以下特点:不可变数据、高阶函数、尾递归优化、闭包和纯函数等。本书可能涵盖了以下的知识点: 1. 纯函数(Pure functions):纯函数是其输出仅由输入参数决定且不产生副作用的函数。在函数...
- **尾递归优化**:Elixir支持尾递归优化,有助于提高性能。 ##### 2.9 枚举类型和流 - **枚举类型**:用于定义一系列枚举值。 - **流处理**:使用`Enum`模块提供的函数处理列表、数组等集合。 ##### 2.10 进程 ...
尾递归优化是函数式语言中常见的优化技术,确保递归调用在函数末尾发生,从而避免无限栈的问题。 在实际开发中,函数式编程可以带来很多好处。例如,它可以帮助编写更简洁、清晰的代码,减少bug,提高代码的可读性...
例如,避免不必要的内存分配,利用尾递归等技巧减少内存消耗。 #### 总结 功能性网络开发涉及的技术栈Elixir、OTP以及Phoenix框架为构建高性能、高可用性的现代Web应用程序提供了强大的支持。通过对这些技术深入...
此外,Scala拥有强大的集合处理能力,对函数式编程的强大支持,例如高阶函数、尾递归优化和强大的模式匹配。这些特性都使得Scala在处理并发任务时,能够提供更简洁、更高效的代码。 了解和掌握Scala的基础知识可以...
函数式编程中常常使用的技术包括尾递归,这可以有效地优化递归调用的性能,避免堆栈溢出等问题。 #### 实体关系模型(ER模型) 实体关系模型是一种用于描述数据结构的概念模型。它通过实体(Entity)、属性...