1

指定されたリストのすべての位置に整数 n を挿入する関数を作成しようとしています。少し例を挙げinsert_everywhere 0 [1;2] -> [[0;1;2]; [1;0;2]; [1;2;0]]ます。私はこれを書きました:

let insert_everywhere l n  = 
  let l_aux = [] in 
  let rec aux l1 l2 = match l1 with
    | [] -> []
    | x::tl -> (l_aux @ [n] @ l1) :: aux tl (l_aux @ [x])
  in aux l l_aux
;;

問題は、呼び出しaux tl (l_aux @ [x])が私が望むことをしないということです。私の考えは次のとおりです。リストの先頭を読んでいるときに、別のリストに挿入し、それを番号nとリストの残りの部分に追加します。このようにして、除外したリストの最終的なリストが得られますが、現在の実装ではありません…</p>

4

1 に答える 1

0

さて、解は というデータ構造に強く関係していますzipper。リストの最初の引数の場合は評価されていないテールを保持しaux、リストの評価されたプレフィックスを保持して、その回答の一部を構築する必要があります。は必要ありませんl_aux。変更可能な変数を使用する代わりに、2 番目の引数を使用します。骨格を見てみよう

let insert_everywhere l (n : int)  =
  let rec aux l1 l2 : int list list = match l1 with
  | [] ->  (* There we need to built a part of answer 
              from l1 prefix, n and empty tail postfix*)
  | x::tl -> (* There we need to construct part of answer *) 
             :: aux tl ( (* construct new prefix from old one and `n` there *) )
  in
  aux l []

それでも答えが見つからない場合は、私の解決策を参照してください。あなたが答えを見つけたら、それを私の答えに追加します。リンクをのぞき見しないでください!:)

PS

let insert_everywhere l (n : int)  =
  let rec aux l1 l2 = match l1 with
  | [] -> [l2 @ [n]]
  | x::tl -> (l2 @ [n] @ l1) :: aux tl (l2 @ [x])
  in
  aux l []
于 2013-11-07T20:53:16.630 に答える