2010-11-29 6 views
5

나는 다음과 같은 목록이 : 나는 무작위로 목록에서 요소를 추출하고필터 요소 - OCaml의

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

합니다. 이 잘 작동

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

길이 3의 무작위 문자열에서 골라 경우 :하지만 추출 요소뿐만 아니라 덜 나는 다음과 같이이 작업을 수행하려고 3.

보다 크기가 3이어야한다 그 목록.

그러나 길이가 < 인 문자열을 선택하면 프로그램이 종료되지 않습니다. 길이가 3이 될 때까지 새로운 코드가 계속 선택되도록 재귀 호출을 시도하고 있습니다.

이것이 종료되지 않는 이유를 알 수 없습니다. print 서술문에 의해 아무 것도 출력되지 않습니다.

답변

3

한 번만 임의 번호를 선택하십시오. 당신이 5를 선택한다고해라. 당신은 계속해서 5 번 반복해서 계속 반복한다. 새로운 난수를 얻어야합니다.

+0

감사합니다. 난 그냥 시도 하고이 게시물을 삭제하고 회신을 보았다 :) 다시 한 번 감사드립니다. – JJunior

4

당신이 아마 쓰고 싶은 목록의 크기와 3보다 큰 크기의 문자열의 수에 따라, 당신은 단지와 함께 목록에 직접 작업 할 수 있습니다,

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 

주입니다 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)) 

이 두 번째 기능은 어떤 문자열이없는, 특히, 더 나은 당신의 공동보다 큰 3.

1

드는 먼저 적절한 요소에 대한 목록을 필터링하여 임의의 숫자를 가지고 더 나은 것, 종료하기 :

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) 

그렇지 않으면 코드가 걸릴 매우 크기 <을 가진 요소의 큰 목록에 종료하는 긴 > 3; 또는 크기가 3 인 요소가없는 목록에서는 더 이상 종료되지 않습니다.