递归函数将字符串转换为整数ML

时间:2014-10-09 03:28:20

标签: recursion sml ml

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

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

因此,调用str2int(“1234”)应该输出1234:int

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

3 个答案:

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




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