見出し画像

関数型プログラミングで解くリストの初級問題-2問目- (約5分)

 関数型プログラミングによるリスト操作の練習問題の2問目です。問題は、OCaml公式ページのものを使いました。
 内容は、問題と答案です。答案の作成時間は、約5分でした。OCaml版とJava版があります。

問題2.

 リストにおける最後の要素および最後から二番目の要素を求める関数last_twoを書け。
 (返り値は、タプルまたは、タプルを保持するoption値、またはこれらに類するものにしています。)

答案

考え方

 関数型プログラミングによるリスト操作の基本的な流れは、以下の1から3になります。
  1. 引数のリストをheadとtailに分離する
  2. tailを引数として再帰呼び出すると共に、その返り値とheadを適当に組み合わせる
  3. 以上を引数のリストが停止条件に達するまで繰り返す

 本問では、停止条件は「引数のリストの要素が二つである」になります。
 また、結果には、それら2要素だけが欲しいので、headを使用せずに再帰呼び出しの戻り値をそのまま返すようにします。

コード

OCaml

let rec last_two = fun lisuto -> match lisuto with
| saigo::sonomae::[] -> Some (saigo, sonomae)
| head::tail -> last_two tail
| [] -> None;;

Java

class Double <T> {
public final T left;
public final T right;
public Double (T left, T right) {
this.left = left;
this.right = right;
}
}
Optional<Double<T>> last_two (List<T> list) {
try {
final var tail = list.subList (2, list.size ());
return tail.isEmpty () ? Optional.of (new Double <>(list.get (0), list.get (1))) : last_two (tail);
}
catch (IllegalArgumentException ex) {
return Optional.empty ();
}
}

 Javaの場合は、タプルがなかったので定義しました。
 また、要素数2以下のリストで発生する例外をoption型に置き換えました。これはOCamlのテキストで学んだものと同じです。

感想

作成時間

 タイトルに書いている時間は、OCamlの答案の作成時間です。前回の答案のパターンマッチングに要素を一つ追加しただけなので、正直5分もかかっていません。
 Javaの答案には、もっとかなり大変に時間がかかりました。 

初Java

 前回のPythonと同様に人気にあやかろうと書いてみました。リファレンスの内容が非常に充実していてわかりやすかったです。Javaすごい。
 ただ、量もすごいので探すのが大変です。option型は同じような名前だったので見つけることができました。タプルもおそらくあるのでしょうが、名前がわかりません。

次回

 次回は、3問目です。Python、Javaときたので、次はC言語あたりでしょうか。


古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。