命令型コードを使用してソートされていない配列の最大値を見つけるのは非常に簡単です
たとえば、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;
}
}
それを行う機能的な方法は何ですか?例えば
- 可変変数なし (例: max
val
を Scala /final
Java で 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 で作業している)
他の機能的な方法に依存せずに最大値を実行する「慣用的な」機能的な方法は何ですか (たとえば、機能的なパラダイムを念頭に置いて、ベアボーン Java でどのように実装しますか)
回答はどの言語でもかまいません (Java / Scala が望ましい)