2010-11-29 14 views
5

Ich habe folgende Liste:Filterelemente in einer Liste nach Länge - Ocaml

["A";"AA";"ABC";"BCD";"B";"C"] 

I zufällig ein Element aus der Liste am extrahieren. Aber das Element I extrahieren sollte 3 Größe sein nur nicht weniger als 3

Ich versuche, dies zu tun, wie folgt:

let randomnum = (Random.int(List.length (list)));; 
let rec code c = 
    if (String.length c) = 3 then c 
    else (code ((List.nth (list) (randomnum)))) ;; 
print_string (code ((List.nth (list) (randomnum)))) ;; 

Dies funktioniert gut, wenn zufällig ein String der Länge 3 wird ausgesucht aus Die Liste.

Aber das Programm beendet nicht, wenn eine Zeichenkette der Länge < 3 abgeholt wird. Ich versuche, einen rekursiven Aufruf zu machen, so dass neuer Code immer wieder aufgenommen wird, bis wir eine Länge = 3 bekommen.

Ich bin nicht in der Lage herauszufinden, warum dies nicht beendet wird. Von der print-Anweisung wird nichts ausgegeben.

Antwort

3

Sie wählen nur einmal eine Zufallszahl. Sagen wir, du wählst 5 aus. Du wiederholst einfach mit 5 immer und immer wieder. Sie müssen eine neue Zufallszahl erhalten.

+0

danke. Ich habe es gerade ausprobiert und wollte gerade diesen Beitrag löschen und sah deine Antwort :) Danke nochmal. – JJunior

4

Was möchten Sie wahrscheinlich schreiben, ist

let rec code list = 
    let n = Random.int (List.length list) in 
    let s = List.nth list in 
    if String.length s < 3 then code list else s 

Beachten Sie, dass, abhängig von der Größe der Liste und die Anzahl der Saiten einer Größe von mehr als 3 ist, möchten Sie vielleicht mit nur direkt auf einer Liste arbeiten Strings größer als 3:

let code list = 
    let list = List.filter (fun s -> String.length s >= 3) list in 
    match list with 
    | [] -> raise Not_found 
    | _ -> List.nth list (Random.int (List.length list)) 

Diese zweite Funktion ist besser, da es immer beenden, vor allem, wenn es keine Strings sind größer als 3

1

Für Ihre Zusammenarbeit de zu beenden, wäre es besser, zuerst die Liste für geeignete Elemente zu filtern, dann Zufallszahl nehmen:

let code list = 
    let suitables = List.filter (fun x -> String.length x = 3) list in 
    match List.length suitables with 
    | 0 -> raise Not_found (* no suitable elements at all! *) 
    | len -> List.nth suitables (Random.int len) 

Andernfalls wird Ihr Code nehmen würde sehr lang auf einer großen Liste von Elementen mit einer Größe < zu beenden > 3; oder schlechter auf einer Liste mit keinem Element der Größe 3, würde es überhaupt nicht beenden!

Verwandte Themen