2016-09-30 107 views
1

這是一項家庭作業。 OCaml似乎是由精神病患者做出的。製作isPrime函數時遇到問題

let prime : int -> bool 
= fun n -> 
    if n > 2 then 
     let a = n - 1 in 
     let rec divisor n a = 
      if a > 1 && n mod a = 0 then false 
     else if a = 2 && n mod a <> 0 then true 
     else divisor n a-1 ;; 
    else if n = 2 then true 
    else if n = 1 then false 

我在編碼不好的,我知道我的isPrime算法是錯誤的。 但我想知道在我的代碼中哪裏是產生語法錯誤的錯誤。

還有什麼辦法可以在遞歸形式中定義isPrime函數嗎?

例子:

let rec prime n = ~

+0

總是在二元運算符周圍放置空格:'f n-1'太容易誤讀爲'f(n-1)'並且很難找到您的錯誤。通過寫'f n - 1',你有更多的機會注意到它實際上被解析爲'(f n) - 1'。 – camlspotter

回答

4

你會得到專家的更好的反應,如果你不無償侮辱他們的語言:-)但我是一個隨和的人,所以我會花刺在你的語法錯誤。

此代碼中存在相當多的問題。這裏有3個,我看馬上:

  1. 符號;;用來告訴您輸入您希望它評估的充分體現解釋。它在函數聲明的中間絕對不合適。

  2. 您的第二個let沒有關聯in。之後每let必須有一個in。唯一的例外是在模塊頂層定義值(例如prime函數)。

  3. 表達式divisor n a-1被解析爲(divisor n a) - 1。你想要這樣的括號:divisor a (n - 1)

+0

傑弗裏的另一個問題是,素數不包括所有的情況,特別是n = 0。也主要生產兩種類型的單位和整數。 –