2015-11-05 50 views
1
(define log2 
     (lambda (n) (if (= n 1) 0 (+ 1 (log2 (quotient (+ n 1) 2)))))) 

我想學習如何在OCaml中創建一個函數,到目前爲止我已經想出了這個。將Log2球拍功能改寫成OCaml功能?

let rem x y =     (* I found this helper function from google*) 
     let rec aux acc i n = 
     if i=n then acc else 
     if acc+1=y then aux 0 (i+1) n else 
     aux (acc+1) (i+1) n in 
     aux 0 0 x;; 

let rec log2 x = 
     match x with 
     | 1 -> 0 
     | 1 + log2 (rem x+1 2);; 

我找不出我使用的最後一個表達式。我想知道添加1的方法,並調用log2函數「 + log2(rem x + 1 2);;」

回答

0
| x -> 1 + log2 (rem x+1 2);; 
+0

您需要將'x + 1'加括號。 –

+0

@JeffreyScofield,你是對的。 – Kakadu

+0

你是對的我需要使用商不餘數。 – user2884707bond

1

一對夫婦的意見:

如果你只是想知道一個if語句是否x = 1,可能比比賽更清晰。

在我看來,方案功能quotient(至少在這種情況下)對應於OCaml /運營商。我不認爲需要rem

的最後一個情況下,你match(如果你想用比賽)將是這個樣子:

| _ -> 1 + log2 (rem (x + 1) 2) 

(但是,我不認爲你需要使用rem或比賽)