2

私はocamlの初心者です。私の問題は、ocamlで整数の数字を取得する方法と、再帰呼び出しによってそれらをリストに入れる方法です

OCaml function digits : int -> int list 引数として整数 n を取り、整数が正の場合、n の数字のリストを n に現れる順序で返します。つまり:

# digits 3124;;
- : int list = [3;1;2;4] 


# let rec digits n =
  if n >0 then digits(n/10)::[]
  else [];;
4

2 に答える 2

4

再帰関数として直接書くdigitsと、最後にリスト全体を逆にしたり、現在のリストの最後に要素を追加したりしない限り、正しい順序で数字を出力するのは難しいでしょう (どちらも非効率的な方法です)。

これは、中間端末再帰関数を使用して行うのが最適です。

let digits2 d =
    let rec dig acc d =
        if d < 10 then d::acc
        else dig ((d mod 10)::acc) (d/10) in
    dig [] d
;;

ここでdigは、リストを構築するために使用されるアキュムレータを取り、次の再帰呼び出しで渡され、最後に全体として返されます (dここの短所を除く)。これは、端末の再帰関数を記述するときによくあるパターンです。

この書き方に慣れるまで少し時間がかかるかもしれませんが、そのうち慣れます。このような単純な関数を書き直そうとすることは、自分自身を訓練する良い方法だと私は考えています。

于 2013-01-10T07:33:07.727 に答える
2

学習目的では、アキュムレータの使用に切り替えるよりも、OPの元のコードを終了する方が便利な場合があります。(n mod 10)重要な点は、現在の数字と再帰呼び出しによって返される値が組み合わされていないことです。

lbonnが言うように、変換する数値が多い場合は、リストに繰り返し追加されないように書き直します(2次の時間がかかり、大量の一時データが生成されます)。

于 2013-01-10T10:38:11.387 に答える