5

私はこの関数で無限ループに陥っています:

let rec showGoatDoorSupport(userChoice, otherGuess, aGame) =                                       
    if( (userChoice != otherGuess) && (List.nth aGame otherGuess == "goat") ) then otherGuess
    else showGoatDoorSupport(userChoice, (Random.int 3), aGame);;

そして、これが私が関数を呼び出す方法です:

showGoatDoorSupport(1, 2, ["goat"; "goat"; "car"]);             

関数の最初の条件で、最初の 2 つの入力パラメーター (1 と 2) が異なる場合は比較し、リスト内のインデックス "otherGuess" の項目が "goat" と等しくない場合は、それを返したいその他推測。

それ以外の場合は、2 番目の入力パラメーターとして 0 ~ 2 の乱数を使用して関数を再度実行したいと考えています。

ポイントは、2 番目のパラメーターが最初のパラメーターと等しくなく、リスト内のそのスロットが「ヤギ」でなくなるまで関数の実行を試み続け、そのスロット番号を返すことです。

4

2 に答える 2

8

を使用しないでください==。物理的な等価性をチェックします。を使用し=ます。2 つの異なる文字列が同じ文字列を含んでいても、物理的に同じになることはありません。(OCaml では文字列が変更可能であるため、これが必要です。)

$ ocaml
        OCaml version 4.00.0

# "abc" == "abc";;
- : bool = false
# "abc" = "abc";;
- : bool = true
于 2012-09-27T23:23:05.123 に答える
1

それを行うもう1つの方法は、を使用することString.compareです。例:

 if String.compare str1 str2 = 0 then (* case equal *)
 else (* case not equal *)
于 2012-09-29T07:12:35.043 に答える