2014-10-09 97 views
0

我需要在ML中編寫自己的遞歸函數,它以某種方式使用ord將一串數字轉換爲整數類型。我可以使用幫助函數,但顯然我應該能夠做到這一點,而不使用(根據我的教授)。將字符串轉換爲整數的遞歸函數ML

我可以假設輸入有效,並且是一個正整數(當然是字符串類型)。

因此,呼叫str2int(「1234」)應該輸出1234:整數

我想我會需要使用爆炸,在某些時候破滅,因爲奧德的字符操作,我的輸入是一個字符串。任何方向將不勝感激。

+0

你能更具體地瞭解你需要什麼樣的幫助嗎?你的假設*爆炸*和* ord *將是有益的是正確的。 – waldrumpus 2014-10-09 08:55:13

回答

1

你可以定義一個輔助函數charsToInt從左至右處理該數字的的字符串中。 在它的最左邊的數字c轉換成一個數字,確實除了與n的10X-多(這是所有以前分析的數字的總和中介)的每一步......

fun charsToInt ([], n) = n 
    | charsToInt (c :: cs, n) = charsToInt (cs, 10*n + ord c - 48) 

val n = charsToInt (explode "1024", 0) 

爲您提供:val n = 1024 : int

正如你所看到的,訣竅是將中間結果傳遞給每次遞歸調用的下一步。處理這類問題時,這是一種非常常見的技術。

+0

這比我能想出的要簡單得多!謝謝!我能寫的最終代碼如下。 – 2014-10-13 20:50:29

2

鑑於你的問題,我想我可以爲你ruin all the fun。這將解決你的問題,但諷刺的是,它不會幫助你。

那麼,字符#'0'的序號是48。所以,這意味着如果你減去任何代表數字的序數,你可以得到它的十進制數。例如

ord(#"9") - 48 

產量9

所以,這需要從0-9代表數給定的人物,並把它變成相應的十進制數的函數是:

fun charToInt(c) = ord(c) - 48 

假如你有一串像「2014」這樣的數字。然後,您可以先將字符串分解爲字符列表,然後將每個字符映射到其相應的小數位。

例如

val num = "2014" 
val digits = map charToInt (explode num) 

explode功能是一個輔助函數,它接受一個字符串,並把它變成文字的列表。

而現在digits將是一個表示小數的整數列表[2,0,1,4];

然後,所有你需要的是應用10的冪來獲得最終的整數。

2 * 10^3 = 2000 
0 * 10^2 = 0 
1 * 10^1 = 10 
4 * 10^0 = 4 

其結果將是2000 + 0 + 10 + 4 = 2014

+0

這就是我想要做的,任何想法如何做到遞歸?這是我正在努力的部分。 – 2014-10-09 20:11:11

1

這就是我想出了:

fun pow10 n = 
 
    if n = 0 then 1 else 10*pow10(n-1); 
 

 
fun str2help (L,n) = 
 
    if null L then 0 
 
    else (ord(hd L)-48) * pow10(n) + str2help(tl L, n-1); 
 

 
fun str2int (string) = 
 
    str2help(explode string, size string -1); 
 
    
 
str2int ("1234");

這給了我正確的結果,但顯然不是到那裏最簡單的方法。