2010-11-29 8 views
5

je la liste suivante:éléments de filtre dans une liste par longueur - Ocaml

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

J'extrais au hasard un élément dans la liste. Mais l'élément I Le texte devrait être de taille 3 ne pas moindre que 3.

Je suis en train de le faire comme suit:

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)))) ;; 

Cela fonctionne bien si au hasard une chaîne de longueur 3 est choisi à partir la liste.

Mais le programme ne se termine pas si une chaîne de longueur < 3 est prise en compte. J'essaye de faire un appel récursif de sorte que le nouveau code continue à être pris jusqu'à ce que nous obtenions un de longueur = 3.

Je suis incapable de comprendre pourquoi ceci ne se termine pas. Rien n'est généré par l'instruction d'impression.

Répondre

3

Vous ne sélectionnez un nombre aléatoire qu'une seule fois. Disons que vous choisissez 5. Vous continuez à récurer avec 5 encore et encore et encore. Vous devez obtenir un nouveau nombre aléatoire.

+0

merci. J'ai juste essayé et était sur le point de supprimer ce poste et j'ai vu votre réponse :) merci encore. – JJunior

4

Qu'est-ce que vous voulez sans doute écrire est

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 

Notez que, en fonction de la taille de la liste et le nombre de chaînes de taille supérieure à 3, vous pouvez travailler directement sur une liste avec seulement les chaînes supérieures à 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)) 

Cette deuxième fonction est mieux, car il fin toujours, surtout quand il n'y a pas de chaînes supérieur à 3.

1

Pour votre co de mettre fin, il serait préférable d'abord filtrer la liste des éléments appropriés, puis prenez votre nombre aléatoire:

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) 

Sinon, votre code prendrait très longtemps de mettre fin à une longue liste d'éléments dont la taille < > 3; ou pire sur une liste sans élément de taille 3, elle ne se terminerait pas du tout!

Questions connexes