嗨,我是 Erlang 世界的新手。当我想到我们需要如何解决以下问题时(并且有一长串类似的问题),我认为它确实效率低下,因为我们正在谈论很多递归。显然,像 C/Java 这样的语言不需要笨拙的递归来解决这个问题,但是使用 Erlang(我猜其他函数式编程语言也需要,也许吧?)你必须这样做。
示例 3 - 追加
该程序连接两个列表:
append([], List) -> List;
append([First|Rest], List) -> [First | append(Rest,List)].
谁能解释为什么这不是问题?
最佳答案
首先,阅读Erlang efficiency guide关于递归。
至于笨拙,不要忘记Erlang列表是单链表,所以你只有一个指向列表头部的“指针”,需要通过遍历列表来访问元素。
这将需要相同数量但与所有指针或引用杂耍的语言不同的笨拙程度。
至于效率,你可以用尾递归的方式来实现。尾递归经过优化( see this SO question ),编译后的代码变得类似于您在 C++ 中实现的代码,唯一的区别是代码指针不是跳来跳去,而是堆栈指针倒带等。
无论如何,尝试在 Java 和 C++ 中实现完全相同的功能,然后我们将看到哪个更笨拙且更具可读性。
关于functional-programming - 函数式编程模型效率(特定于 Erlang),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1496246/