2012-09-27 33 views
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"]);    

在第一條件,我比較前兩個輸入參數(1和2),如果不同,並且如果索引「otherGuess」中列表中的項不等於「山羊」,我想返回其他猜測。

否則,我想用0-2之間的隨機數作爲第二個輸入參數再次運行該函數。

重點是繼續嘗試運行該函數,直到第二個參數不等於第一個,並且該列表中的該插槽不是「山羊」,然後返回該插槽編號。

+1

看起來像'c'編程習慣 –

回答

8

請勿使用==,它會檢查物理上的相等性。使用=。即使它們包含相同的字符序列,兩個不同的字符串在物理上也不會相同。 (這是必要的,因爲字符串是OCaml中可變的。)

$ ocaml 
     OCaml version 4.00.0 

# "abc" == "abc";; 
- : bool = false 
# "abc" = "abc";; 
- : bool = true 
+0

太棒了:)你是一個Ocaml高手! –

+0

謝謝,雖然我真的只是一個謙虛的練習者。 Ὁβοςβραχύς,ἡδὲτέχνημακρή - 生命短暫,工藝悠久。 –

+4

沿着完全相同的行,這裏不應該使用'!=',結構差異運算符是'<>' - 儘管它對整數沒有太大的區別。 – gasche

1

另一個要做到這一點是使用String.compare。一個例子:

if String.compare str1 str2 = 0 then (* case equal *) 
else (* case not equal *) 
+0

在stdlib中沒有這樣的函數,你可能是指'String.compare' – ygrek

+0

是的,謝謝;) –