2012-04-21 88 views
2

因此,我有作業,我正在盡我所能解決它。 我們必須將英文翻譯成摩爾斯電碼。 每個單詞都必須分開。將字符串分割成Ocaml中的單詞字符列表

例如:如果我進入this is應該寫:["_";"....";"..";"..."]["..";"...."]

我寫了2個功能,到目前爲止(小寫字母爲大寫和匹配字母和數字用摩爾斯電碼),現在我需要編寫函數轉換字符串到這樣的字符列表清單:

stringSAllCaps " ban an a ";; 
- : char list list = [['B'; 'A'; 'N']; ['A'; 'N']; ['A']] 
stringSAllCaps "banana";; 
- : char list list = [['B'; 'A'; 'N'; 'A'; 'N'; 'A']] 

我知道如何將字符串轉換爲字符列表,但不知道下一步該怎麼做。我不需要有人爲我完全解決這個問題,只是爲了引導我走向正確的方向。

這是我做了什麼:

let explode niz = 
    let rec exp a b = 
    if a < 0 then b 
    else exp (a - 1) (niz.[a] :: b) in 
    exp (String.length niz - 1) [] 
    ;; 

編輯:

TY您的幫助:) 我已經成功地解決了這個問題,但不是這樣。我會在稍後發佈。 當我解決它,繼續我的作業,我意識到,我不得不使用whilepointers現在我再次卡住(指針不是我最好的朋友..)。有什麼建議麼?

我此刻的解決方案:

# let explode str = 
let rec exp = function 
| a, b when a < 0 -> b 
| a, b -> exp (a-1, str.[a]::b) 
in 
exp ((String.length str)-1, []);; 
# let split lst ch = 
let rec split = function 
| [], ch, cacc', aacc' -> cacc'::aacc' 
| c::lst, ch, cacc', aacc' when c = ch -> split (lst, ch, [], cacc'::aacc') 
| c::lst, ch, cacc', aacc' -> split (lst, ch, c::cacc', aacc') 
in 
split (lst, ch, [], []);; 

回答

2

我想你應該開始由:

  • 重命名你的遞歸函數的參數有一個更明確的含義(如indexcurrent_word例如)
  • 在遞歸函數中添加一個新參數來存儲已經看到的單詞(seen_words
  • 測試niz.[a]是否爲空字符,如果是這種情況,則執行正確的操作。更新當前單詞或已經看到的單詞列表。