[ad_1]
OCaml とプログラミング全般に数日を費やしましたが、(少なくとも私にとっては) 非常に難しい問題に直面しました。それは、整数の最大桁を見つけることです。
私が試したこと:
私は次のことを試しました:
let rec maxi' x a = if x < 10 then x else maxi' (x mod 10) (x / 10 * a) let maxi x = maxi' x 0
整数の最大値ではなく、最後の桁を返します。 これで私を助けてください。
解決策 1
手動で行う方法を考えてみてください。各桁を順番に見て、「現在の最大値」と照合します。
小さければ無視して次に進みます。
そうしないと、「現在の最大値」になり、次を見ることになります。
それらをすべて見たら、「現在の最大値」に最大のものがあります
あなたのコードはそれを行いません.「現在の最大値」はまったくありません.
少し考えてみてください。そうすれば、何をする必要があるかがかなり明白になるはずです。
解決策 2
最大の桁を収集するためにアキュムレータは必要ありません。 ただし、これまでのところ最大の桁が必要です。
したがって、これはこのように行うことができます。 ローカル関数を作成できます max_digit’ : int -> int -> int これは再帰的なものです。
そして、右端の数字を削除して再帰的に呼び出し、右端を抽出し、現在の最大値と現在の右端の最大値であるかどうかを確認します。 それを再帰呼び出しで使用します。
let max_digit number = let rec max_digit' number maxsofar = ... max_digit' (number / 10) (max maxsofar (number mod 10)) in max_digit' number (number mod 10)
したがって、内側の let は、ローカル再帰関数への最初の呼び出しです。
それを分割するペアを返すローカル関数を持つことさえできます。 次に、ベースケースとして (0, maxdigit) をキャッチしたケースを使用できます。 And (number, digit) は別のケースです。
このようなもの。
let max_digit number = let extract_digit number = (number/10), (number mod 10) in let rec max_digit' number maxsofar = match extract_digit number with | (0, cand) -> max cand maxsofar | (number', cand) -> max_digit' number' (max cand maxsofar) in max_digit' number (number mod 10)
これは OCaml の通常のコーディング方法です。 はい、関数を REPL に記述してテストし、部分ごとに組み合わせて構築します。 (F# は OCaml の MS バージョンですが、他のライブラリといくつかの構文変更があることに注意してください)。
[ad_2]
コメント