函数式编程-不变性昂贵吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 问题分为两部分。首先是概念上的。接下来的内容将在Scala中更具体地研究相同的问题。 在编程语言中仅使用不可变数据结构是否会使在实践中实现某些算法/逻辑本质上在计算上更加昂贵?这引出了一个事实,即不变性是纯功能语言的核心宗旨。还有其他因素对此有影响吗? 让我们举一个更具体的例子。通常对内存数据结构使用可变操作来教授和实现Quicksort。如何以一种PURE功能方式实现这种事情,并且具有与可变版本相当的计算和存储开销。特别是在Scala中。我在下面列出了一些粗略的基准。 更多细节: 我来自命令式编程背景(C ++,Java)。我一直在探索函数式编程,特别是Scala。 纯函数式编程的一些主要原理: 职能是头等公民。 函数没有副作用,因此对象/数据结构是不可变的。 即使现代JVM在创建对象方面非常高效,并且垃圾回收对于短寿命的对象而言非常便宜,但将对象创建最小化可能还是更好的选择吧?至少在并发和锁定不是问题的单线程应用程序中。由于Scala是一种混合范例,因此可以根据需要选择使用可变对象编写命令性代码。但是,作为一个花了很多年尝试重用对象并最小化分配的人。我希望对不允许的思想流派有所了解。 作为一个具体案例,我对本教程 6中的代码片段感到有些惊讶。它有一个Java版本的Quicksort,然后是一个简洁的Scala实现。 这是我对实现进行基准测试的尝试。我尚未进行详细的分析。但是,我的猜测是,Scala版本的速度较慢,因为分配的对象数是线性的(每个递归调用一个)。尾叫优化有没有机会发挥作用?如果我是对的,Scala支持针对自递归调用的尾部调用优化。因此,它应该只是在帮助它。我正在使用Scala 2.8。 Java版本 public class QuickSortJ { public static void sort(int[] xs) { sort(xs, 0, xs.length -1 ); } static void sort(int[] xs, int l, int r) { if (r >= l) return; int pivot = …