2010-11-29 20 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的元素的列表上更糟,它不会终止!