2010-10-18 32 views
1

我試圖將給定的十進制值轉換爲其對應的二進制形式。我正在使用Ocaml,對此我不太瞭解,而且很困惑。到目前爲止,我有以下代碼Ocaml中從十進制到二進制的轉換

let dec_to_bin_helper function 1->'T' | 0->'F' 
let dec_to_bin x = 
      List.fold_left(fun a z -> z mod 2 dec_to_bin_helper a) [] a ;; 

我必須包括在這裏,我想我的輸出將在T的和F的列表的形式,其中T的代表二進制1和F的代表二進制的0 如果我嘗試運行上面的代碼,它給了我一個錯誤,說:「錯誤:這個表達式不是一個函數;它不能被應用」 我明白,我打電話給輔助函數的部分是錯誤的...在這件事上的任何幫助會不勝感激!

回答

2

我真的不明白你的第二個功能。您正在摺疊一個空列表,並且您的函數採用它從不使用的參數x。我是否正確地假設你想要一個數字並返回一個代表二進制數的'T和'F列表?如果是這樣的情況下,該代碼應工作:

let dec_to_bin x = 
     let rec d2b y lst = match y with 0 -> lst 
     | _ -> d2b (y/2) ((dec_to_bin_helper (y mod 2))::lst) 
     in 
     d2b x [];; 

此函數插入​​物(在x mod 2)轉換成一個T/F到一個列表,然後遞歸調用X/2和列表中的功能。當x = 0時,返回列表。如果在0上調用它,將返回一個空列表(我不確定這是否是你想要的)。

我認爲你遇到的問題是,你正在對列表進行處理,就好像它們是可變的,並且認爲fold會突變列表。情況並非如此,fold只是遍歷列表中的每個元素並向其應用一個函數。既然你的清單是空的,它什麼都不做。

+0

尼基,這正是我想要做的,現在我明白我是如何錯誤地使用fold_left的。感謝您的解釋!但是,爲了讓事情更清楚,你介紹一下你的嵌套函數「在d2b x [] ;;中使用rec d2b x lst =(* code *)」作品?特別是如果我手工追蹤這個問題,「在d2b x [] ;;」工作? – 2010-10-18 17:18:19

+0

啊,當然。 d2b是一個嵌套函數。讓rec d2b x =(* code *)在聲明函數時,下面的代碼在x上調用它(我可能不應該重用相同的變量名,我將編輯它)和一個空列表。我選擇這樣做的原因是,您可以調用dec_to_bin#並且不必擔心列表。 – 2010-10-18 17:34:23

+0

這使得現在很有意義。再次感謝!如果我理解正確的話,那麼它意味着來自「dec_to_bin」的「x」被傳遞爲「d2d」作爲「y」,然後作爲「d2b」自稱「y」被修改並因此得到我們的列表?對不起,如果我問了太多問題,我只是想讓基礎知識正確!非常感謝你的幫助! – 2010-10-18 18:26:06