我需要在ML中编写自己的递归函数,以某种方式使用ord将一串数字转换为整数类型。我可以使用辅助函数,但显然我应该能够在不使用辅助函数的情况下执行此操作(根据我的教授的说法)。
我可以假设输入有效,并且是一个正整数(当然是字符串类型)。
因此,调用str2int(“1234”)应该输出1234:int
我假设我需要在某些时候使用explode和implode,因为ord对字符进行操作,而我的输入是一个字符串。任何方向都将不胜感激。
答案 0 :(得分:2)
鉴于你问过,我想我可以ruin all the fun给你。这将解决您的问题,但具有讽刺意味的是,它对您没有帮助。
嗯,角色#'0'
的序号是48
。因此,这意味着如果您减去表示数字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
答案 1 :(得分:1)
您可以定义一个辅助函数charsToInt
,它从左到右处理字符串中的数字。
在每一步,它将最左边的数字c
转换为数字,并添加n
的10倍倍数(这是所有先前解析的数字的中间总和)......
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
如您所见,诀窍是在每次递归调用时将中间结果传递给下一步。在处理这类问题时,这是一种非常常见的技术。
答案 2 :(得分: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");

这给了我正确的结果,但显然不是最简单的方法。