2017-06-17 70 views
0

我試圖編寫一個函數,它接受一個列表,並返回列表中連續重複元素的數量。如何計算Ocaml中連續重複的次數

例如,給定[1;2;3;3;4;4;5],函數應該返回2

這是我的初步實現,但不幸的是它總是返回0。我不太確定錯誤在哪裏。 如何改善它的任何幫助將不勝感激。

let rec count_successive_duplicates (lst: int list) (count: int) : (int) = 
    match lst with 
    | [] | [_]-> 0 
    | x :: y :: tl -> 
     if x = y then count_successive_duplicates (y::tl) (count + 1) else count_successive_duplicates (y::tl) count 
    ;; 

let() = 
    print_int (count_successive_duplicates [1;2;3;3;4;4;5] 0) 
+1

你需要的地方獲得一個最大值。您的計數有時會增加,但a)在遇到新的序列時不會重置b)最終總是返回「0」 – Bergi

+0

我發現在可用時我沒有使用增加的計數。謝謝你的提示。我已經看到了這個bug – kevgathuku

+0

哦,我誤解了你想做的事情,我以爲你想要計算最長的*重複序列。但是,這只是一個小錯誤。 – Bergi

回答

0

好像我是做,而不是計算計數的東西總是返回0基礎方案傻。之前的版本只是忽略了計算得到的count。這就是現在的工作:

let rec count_successive_duplicates lst count : (int) = match lst with 
    | [] | [_]-> count 
    | x :: y :: tl -> 
    if x = y then count_successive_duplicates (y::tl) (count + 1) else count_successive_duplicates (y::tl) count 
;; 

let() = 
    print_int (count_successive_duplicates [1;2;3;3;4;4;5] 0) 
1

最後,你要與計數返回蓄能器,而不是0總是:

let rec count_successive_duplicates (lst: int list) (count: int) : (int) = 
    match lst with 
    | [] | [_] -> count 
(*    ^^^^^ */) 
    | x :: y :: tl -> count_successive_duplicates (y::tl) (count + if x = y then 1 else 0)