我需要在ML中編寫自己的遞歸函數,它以某種方式使用ord將一串數字轉換爲整數類型。我可以使用幫助函數,但顯然我應該能夠做到這一點,而不使用(根據我的教授)。將字符串轉換爲整數的遞歸函數ML
我可以假設輸入有效,並且是一個正整數(當然是字符串類型)。
因此,呼叫str2int(「1234」)應該輸出1234:整數
我想我會需要使用爆炸,在某些時候破滅,因爲奧德的字符操作,我的輸入是一個字符串。任何方向將不勝感激。
我需要在ML中編寫自己的遞歸函數,它以某種方式使用ord將一串數字轉換爲整數類型。我可以使用幫助函數,但顯然我應該能夠做到這一點,而不使用(根據我的教授)。將字符串轉換爲整數的遞歸函數ML
我可以假設輸入有效,並且是一個正整數(當然是字符串類型)。
因此,呼叫str2int(「1234」)應該輸出1234:整數
我想我會需要使用爆炸,在某些時候破滅,因爲奧德的字符操作,我的輸入是一個字符串。任何方向將不勝感激。
你可以定義一個輔助函數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
正如你所看到的,訣竅是將中間結果傳遞給每次遞歸調用的下一步。處理這類問題時,這是一種非常常見的技術。
這比我能想出的要簡單得多!謝謝!我能寫的最終代碼如下。 – 2014-10-13 20:50:29
鑑於你的問題,我想我可以爲你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
這就是我想要做的,任何想法如何做到遞歸?這是我正在努力的部分。 – 2014-10-09 20:11:11
這就是我想出了:
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");
這給了我正確的結果,但顯然不是到那裏最簡單的方法。
你能更具體地瞭解你需要什麼樣的幫助嗎?你的假設*爆炸*和* ord *將是有益的是正確的。 – waldrumpus 2014-10-09 08:55:13