【问题标题】:recursive function to convert string to integer ML将字符串转换为整数的递归函数 ML
【发布时间】:2014-12-03 21:01:25
【问题描述】:

我需要在 ML 中编写我自己的递归函数,它以某种方式使用 ord 将一串数字转换为整数类型。我可以使用辅助函数,但显然我应该能够在不使用辅助函数的情况下做到这一点(根据我的教授)。

我可以假设输入是有效的,并且是一个正整数(当然是字符串类型)。

所以,调用 str2int ("1234") 应该输出 1234: int

我假设我需要在某个时候使用 explode 和 implode ,因为 ord 对字符进行操作,而我的输入是一个字符串。任何方向将不胜感激。

【问题讨论】:

  • 您能否更具体地说明您需要什么样的帮助?您认为 explodeord 会有所帮助的假设是正确的。

标签: recursion sml ml


【解决方案1】:

鉴于您的要求,我想我可以为您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

【讨论】:

  • 这就是我认为必须要做的事情,知道如何递归地这样做吗?这就是我正在努力的部分。
【解决方案2】:

您可以定义一个辅助函数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

如您所见,诀窍是在每次递归调用时将中间结果传递到下一步。在处理这类问题时,这是一种非常常见的技术。

【讨论】:

  • 这比我想出的要简单得多!谢谢!我能够编写的最终代码如下。
【解决方案3】:

这是我想出的:

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");

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

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2017-09-17
    • 2021-05-17
    • 2013-02-02
    相关资源
    最近更新 更多