2016-11-08 3 views
0

Из примера списка ["dog"; "cat"; "dog"; "cat"; "dog"] Мне нужно найти количество времени, в течение которого слово этот список Результат -> [(«dog», 3); («cat», 2)] Но я получаю странный результат: [(«dog», 1); («кошка», 1); («собака», 2); («кошка», 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 восстанавливает кортеж (слово, число);

Фактическая функция Occorrenze. Я не нахожу проблему! Спасибо за помощь!

+2

Возможный дубликат [создать гистограмму OCaml] (http://stackoverflow.com/questions/40442527/create-a-histogram-ocaml) – coredump

ответ

1

Действительно, у вас есть та же проблема, что и в предыдущей странице StackOverflow. Вы добавляете новый элемент в вывод для каждого слова, которое вы найдете. Это не будет работать, так как вы хотите иметь только один элемент в выходе для каждого уникального слова.

В сущности, вам необходимо обновить существующую запись в списке, а не добавлять новую.

Однако списки в OCaml неизменяемы. Фактически вы не можете обновлять список, вы можете создать только новый с нужным содержимым.

Вот функция, которая обновляет список неотрицательных целых чисел: округляет каждый элемент до следующего четного числа.

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, он создает новый список, который модифицирован по желанию.

Это похоже на вашу проблему, за исключением того, что вы ищете элемент, который соответствует вашему слову, а не для нечетных чисел.

В качестве побочного комментария использование списка для хранения ваших счетов не является особенно масштабируемым решением. Если ваши входные списки могут быть большими, было бы лучше использовать что-то с сложностью log n, например Map. Со списком вы получаете линейную сложность, так что вы получаете общую сложность n^2. Я предполагаю, что это не главное; т. е. это упражнение.

Смежные вопросы