3

List.fold_left2を使用して、リストが回文であるかどうかを確認する関数があります。(フォールドの使用はオプションではありません。これは宿題の問題です。)

let is_p lst =
  List.fold_left2 (fun acc e1 e2-> if (e1=e2) then acc else false) true lst (List.rev lst)

しかし、私はそれを最適化したいと思います。不一致が1つ見つかったらすぐに「false」を返す最良の方法は何ですか?

例外をスローしたくないのですが、それが最善の答えかもしれないと思います。また、匿名関数を次のように変更することも検討しました。

fun acc e1 e2-> if (not acc) then false else (if (e1=e2) then acc else false)
4

1 に答える 1

4

例外を使用するか、フォールドをカスタム再帰関数に「展開」します。折りパターンは常に完全なリストを横断します。

一部の言語では例外処理がコストのかかる操作になる可能性があるため、両方のベンチマークを必ず行ってください(これがOCamlに当てはまるかどうかはわかりません)。

于 2011-09-15T13:39:52.793 に答える