2012-09-27 38 views
5

tôi bị mắc kẹt trong một vòng lặp vô hạn trong chức năng này:Bị mắc kẹt trong một vòng lặp vô hạn trong một hàm

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

Và dưới đây là cách tôi gọi hàm:

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

Trong lần đầu tiên điều kiện trong hàm, tôi so sánh 2 tham số đầu vào đầu tiên (1 và 2) nếu khác nhau, và nếu mục trong danh sách tại chỉ mục "otherGuess" không bằng "dê", tôi muốn trả lại đối tượng kia.

Nếu không, tôi muốn chạy lại hàm bằng một số ngẫu nhiên từ 0-2 làm tham số nhập thứ hai.

Vấn đề là tiếp tục cố gắng chạy hàm cho đến khi tham số thứ hai không bằng giá trị đầu tiên, và vị trí đó trong Danh sách không phải là "dê", sau đó trả về số thứ tự đó.

+1

giống như 'c' thói quen lập trình –

Trả lời

8

Không sử dụng ==, nó sẽ kiểm tra tính bình đẳng về thể chất. Sử dụng =. Hai chuỗi khác nhau sẽ không bao giờ bằng nhau, ngay cả khi chúng chứa cùng một chuỗi ký tự. (Điều này là cần thiết, bởi vì các chuỗi có thể biến đổi trong OCaml.)

$ ocaml 
     OCaml version 4.00.0 

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

Tuyệt vời:) Bạn là chủ nhân của Ocaml! –

+0

Cảm ơn, mặc dù thực sự tôi chỉ là một học viên khiêm nhường. Ὁ βίος βραχύς, ἡ δὲ τέχνη μακρή - Cuộc sống ngắn ngủi, nghề thủ công rất dài. –

+4

Cùng dòng chính xác, '! =' Không nên được sử dụng ở đây, toán tử sai số cấu trúc là '<>' - mặc dù nó không tạo ra nhiều sự khác biệt về số nguyên. – gasche

1

Một cách khác là sử dụng String.compare. Ví dụ:

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

không có chức năng như vậy trong stdlib, bạn có thể có nghĩa là 'String.compare' – ygrek

+0

yeah, cảm ơn;) –

Các vấn đề liên quan