2010-11-29 39 views
5

我有以下列表:濾芯 - ocaml的

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

我隨意地提取從列表中的一個元素。但是我提取元素應該是大小3只有不超過3較輕

我試圖做到這一點,如下所示:

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

您只挑選一次隨機數。假設你選擇了5.你只需要一遍又一遍地繼續遞歸5。你需要得到一個新的隨機數。

+0

謝謝。我剛剛嘗試過,並即將刪除此帖子,並看到您的回覆:)再次感謝。 – JJunior 2010-11-29 05:18:50

4

你可能想要寫什麼是

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的字符串的數量,您可能希望名單上,只有直接合作字符串大於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的元素的列表上更糟,它不會終止!