使用命令式代码在未排序的数组中查找最大值非常简单
例如在Java中(我相信它可以写得更好,仅用于说明目的)
public class Main {
public static void main(String[] args) {
int[] array = {1,3,5,4,2};
int max = findMax(array);
System.out.println(max);
}
public static int findMax(int[] array){
int max = Integer.MIN_VALUE; //or array[0], but it requires a null check and I want to keep it simple :)
for (int i = 0, size = array.length; i < size ; i++) {
int current = array[i];
if(current > max) max = current;
}
return max;
}
}
这样做的功能性方式是什么?例如
- 没有可变变量(例如
val
,在 Scala /final
Java 中使 max 成为 a) - 没有循环(例如使用递归,尾部首选)
在 Scala 的资料中,我看到它是使用 recudeLeft 完成的,这看起来很聪明
def max[B >: A](implicit cmp: Ordering[B]): A = {
if (isEmpty)
throw new UnsupportedOperationException("empty.max")
reduceLeft((x, y) => if (cmp.gteq(x, y)) x else y)
}
但是假设我(由于某种原因)没有可用/实现的 reduce/reduceLeft(并且由于某种原因我不想/不能实现它,即我正在使用纯 Java)
什么是在不依赖其他函数方法的情况下完成 max 的“惯用”函数方式(例如,我将如何在基本 Java 中实现它,但要考虑函数范式)
答案可以使用任何语言(不过首选 Java / Scala)