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の文字列が選択された場合、プログラムは終了しません。 私は長さ= 3のいずれかを取得するまで、新しいコードが取得され続けるように再帰呼び出しを試みています。

これが終了しない理由を理解できません。 print文によって何も出力されません。

答えて

3

乱数は1回だけ選択します。あなたが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の要素がないリストでは、それはまったく終了しませんでした。