2016-12-19 4 views
-1

Как подсчитать все последовательные повторяющиеся элементы в списке и упаковывать их вместе с количеством их вхождений в виде пар.Как подсчитать появление каждого символа в списке?

Пример:

compress("Hello") == [{1,$H},{1,$e},{2,$l},{1,$o}] 

Я попробовал эту функцию, но у меня есть ошибки, кто-то может помочь мне решить:

compress([])-> 
    []; 
compress(L)-> 
    helper(L,0). 

helper([], _)-> 
    []; 
helper([H|T], Count)-> 
    case H == hd(T) of 
     true -> helper(T,Count), [{Count+1, H}]; 
     false -> helper(T, Count), [{Count, H}] 
    end. 
+0

Вы можете, по крайней мере, очистить предупреждения компилятора. Что вы хотите делать в этой строке? 'true -> Count + 1, helper (T, Count), [{Count, H}];' –

ответ

2

таким образом:

compress(L) -> 
    helper(L, []). 

helper([], Acc) -> lists:reverse(Acc); 
helper([H|T], [{Count, H}|Acc]) -> 
    helper(T, [{Count+1, H}|Acc]); 
helper([H|T], Acc) -> 
    helper(T, [{1, H}|Acc]). 

Или более простой и на некоторых платформах быстрее (менее мусорного) версии:

compress2([]) -> []; 
compress2([H|T]) -> 
    helper2(T, H, 1). 

helper2([H|T], H, Count) -> 
    helper2(T, H, Count+1); 
helper2([H|T], C, Count) -> 
    [{Count, C}|helper2(T, H, 1)]; 
helper2([], C, Count) -> 
    [{Count, C}]. 
Смежные вопросы