我需要在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