2016-11-08 4 views
0

リストの例["dog"; "cat"; "dog"; "cat"; "dog"]単語の結果がこのリスト 結果 - > [( "犬"、3);( "猫"、2)]しかし、私は奇妙な結果を取得します:[( "犬"、1); (「cat」、1); ( "dog"、2); (「cat」、2); (「犬」、3)]Ocaml - リスト内の単語数を確認する

私のコードはこれです:単語が他のリストは私が偽与え内にない場合

let rec nuovaParola par l = 
match l with 
[] -> true 
|(a,_)::z ->if (par=a) then false 
      else nuovaParola par (List.tl l);; 

let rec contaParole par l = 
let rec contatore par l cont = 
    match l with 
    [] -> (par, cont) 
    |x::y -> if(par=x) then contatore par y (cont+1) 
      else contatore par y cont 
in contatore par l 0;; 

let rec occorrenze l = 
let rec aux l l1= 
match l with 
    [] -> l1 
    |x::y -> if (nuovaParola x l1) then aux y [email protected][(contaParole x l)] 
      else aux y l1 
in aux l [];;` 

nuovaParolaは私に真を与えます。

contaParolaはタプルを( "word"、number)で返します。

Occorrenzeが主な機能です。私は問題を見つけません! 助けてくれてありがとう!

+2

[ヒストグラムOCamlを作成する]の可能な複製(http://stackoverflow.com/questions/40442527/create-a-histogram-ocaml) – coredump

答えて

1

実際には、前述のStackOverflowページと同じ問題があります。あなたが見つけたすべての単語について、新しい要素を出力に追加しています。各ユニークワードの出力に要素が1つしかないようにするため、これは機能しません。

本質的に、新しいエントリを追加するのではなく、リスト内の既存のエントリを更新する必要があります。

しかし、OCamlのリストは不変です。実際にはリストを更新することはできません。希望の内容で新しいリストを作成することしかできません。

ここでは、負でないintのリストを更新する関数です。すべての要素を次の偶数に丸めます。

let rec upeven l = 
    match l with 
    | [] -> [] 
    | h :: t -> 
     let h' = if h mod 2 = 1 then h + 1 else h in 
     h' :: upeven t 

重要な点は、それが必要に応じて変更された新しいリストを作成し、この関数はリストlを変更しないということです。

これは奇数ではなく、単語に一致する要素を探していることを除いて、問題と似ています。

サイド・コメントとして、リストを使用してカウントを格納することは、特にスケーラブルな解決策ではありません。入力リストが大きくなる可能性がある場合は、Mapなどのlog nの複雑さを持つものを使用する方がよいでしょう。リストでは、線形の複雑さを得るので、全体的にn^2の複雑さが得られます。私はこれが主要なポイントではないと仮定しています。すなわち、これは学習の練習である。

関連する問題