2017-06-17 6 views
0

リストを取り込み、リスト内の連続する複製要素の数を返します。例えばOcamlで連続する複製の数を数える方法

[1;2;3;3;4;4;5]与えられ、関数はこれが私の最初の実装ですが、残念ながら、それは常に0を返し2

を返す必要があります。私はバグがどこにあるのかは分かりません。 改善方法についてのお手伝いがあれば幸いです。

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

あなたが最大のどこかを取得する必要があります。あなたのカウントは時々増加しますが、新しいシーケンスに遭遇したときにはリセットされません。最後には常に0が返されます。 – Bergi

+0

利用可能な場合は増分カウントを使用していません。先端に感謝します。私はバグを今見たことがあります – 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) 
関連する問題