2017-06-17 6 views
0

Ich versuche, eine Funktion zu schreiben, die eine Liste aufnimmt und die Anzahl der aufeinanderfolgenden doppelten Elemente in der Liste zurückgibt.Wie man die Anzahl der aufeinanderfolgenden Duplikate in Ocaml zählt

Zum Beispiel gegeben [1;2;3;3;4;4;5], sollte die Funktion 2

Dies ist meine erste Implementierung zurück, aber leider 0 es gibt immer. Ich bin mir nicht sicher, wo der Fehler liegt. Jede Hilfe zur Verbesserung wird sehr geschätzt.

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

Sie werden ein Maximum irgendwo erhalten müssen. Ihre Zählung nimmt derzeit manchmal zu, aber a) wird nicht zurückgesetzt, wenn eine neue Sequenz auftritt b) Am Ende gibt es immer '0' zurück – Bergi

+0

Ich sehe, dass ich nicht die inkrementierte Anzahl verwende, wenn sie verfügbar ist. Danke für den Tipp. Ich habe den Fehler jetzt gesehen – kevgathuku

+0

Oh, ich habe missverstanden, was Sie tun wollen, ich dachte, Sie wollten die * längste * Folge von Duplikaten zählen. Aber ja, es ist nur ein kleiner Fehler. – Bergi

Antwort

0

Scheint Ich war etwas dumm von immer 0 für den Basisfall zurückkehrt, statt der berechneten Zahl zu tun. Die vorherige Version ignorierte nur die berechnete count, die es erhielt. Das funktioniert jetzt:

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

Am Ende wollen Sie den Akku mit der Zählung statt 0 immer zurück:

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) 
Verwandte Themen