Welcome

首页 / 软件开发 / 数据结构与算法 / 函数式思维: 转换和优化各种语言的更多功能比较

函数式思维: 转换和优化各种语言的更多功能比较2013-10-07 ibm Neal Ford函数式编程起源于数学和计算机科学,这两种科学对术语都各执一词。语言和框架设计师们开发了他们最喜欢的命名法 ,结果发现基础范式已经有名称了。由于术语存在不一致性而使得了解函数式编程范式变得不容易。

在 “大量转换 ” 中,我提出了对质数进行分类的问题,并且跨各种函数式语言就 JVM 和两种函数式 Java 框架实现了一种解决方案。本 期文章继续探讨上一期的主题,通过两种方式优化了上一期的算法,展示了各种语言中的后续更改。本期文章和上一期文章 同样阐述了各种工具和语言中术语与特性可用性之间的区别。具体来讲,我练习了这些示例中的 map、filter 和 memoize 。

使用纯 Java 语言优化的质数分类法

所陈述的问题是确定一个数是否是质数,一个质数的因子只包括 1 和它本身。在解决该问题的多种算法中,我选择了阐述函数式编程领域的过滤 和映射。

在上一期中,我对确定一个 数的因子的算法采取了一种朴素法,选择了简单代码而不是最佳执行代码。在本期中,我使用几种不同的函数式概念优化了 这种算法,此外,我还优化了用例的每个版本,类在该用例中调用了多次以便对同一个数进行分类。

我的用于确定 质数的原始 Java 代码如清单 1 所示:

清单 1. 质数分类器的原始 Java 版本

public class PrimeNumberClassifier {private Integer number;public PrimeNumberClassifier(int number) {this.number = number;}public boolean isFactor(int potential) {return number % potential == 0;}public Set<Integer> getFactors() {Set<Integer> factors = new HashSet<Integer>();factors.add(1);factors.add(number);for (Integer i = 2; i < number; i++)if (isFactor(i))factors.add(i);return factors;}public int sumFactors() {int sum = 0;for (int i : getFactors())sum += i;return sum;}public boolean isPrime() {return sumFactors() == number + 1;}}