1

私はOCamlを学んでいて、解決しようとしている演習で立ち往生しています。

演習では、整数を取得し、次のようにその整数までのすべての偶数の整数を出力します。

入力:5出力: "0-2-4"

入力:10出力: "0-2-4-6-8"

負の値、文字列入力などのエラーを含める必要があります。

再帰関数を実行し、パターンマッチングを使用してエッジケースを設定し、再帰を停止することを考えていました。

私の問題は、Rubyから来ていることです。Rubyでは、入力までの整数の配列を作成し、その配列をarray.select、array.filterなどで変更し、コンテンツを連結するというアプローチになります。配列を文字列に変換します。私はOCamlでこのようなことをするのがずっと難しいです。

任意のヒント?

4

3 に答える 3

3

あなたはOCamlであなたのRubyアプローチを使うことができます、そして実際、このように働くことは非常に慣用的です。配列の代わりに、おそらくリストを使用することをお勧めします。最大値までの整数のリストを取得する組み込み関数を知りませんが、それを書くのは簡単です。その後List.filter、リストから必要な要素を選択するために使用できます。

追加のライブラリの使用が許可されている場合は、OCamlBatteriesIncludedに多くの便利な機能があります。モジュールをざっと見た後、BatListn未満の整数の範囲に対してこの関数を思いつきました。

let range n = BatList.init n (fun x -> x)
于 2012-07-31T03:59:43.073 に答える
1

次のようなものから始めます

let output_even_less_then n = 
   let rec outloop i n = 
     if i < n then begin
        Printf.printf "%d\n" i;
        outloop (i+2) n
     end
   in
     outloop 0 n

次に、入力と妥当性テストでそれを完了します

于 2012-07-31T03:32:23.380 に答える
0

単純なwhileループを使用することもできます。これは、最初は理解しやすいかもしれません。前の回答の機能的なスタイルは、少し効率的です。

let exercise () =
    let line = input_line stdin in
    let n =
        try int_of_string line
        with e ->
            Printf.eprintf "Could not parse line '%s'\n%!" line;
            exit 1
    in
    if n < 0
    then Printf.eprintf "%i is negative\n%!" n;
    let i = ref 0 in
    while !i < n do
        Printf.printf "%i\n" !i;
        i := !i + 2;
    done
;;

exercise ()
于 2012-07-31T06:55:19.997 に答える