2014-10-09 96 views
0

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

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

因此,呼叫str2int(“1234”)应该输出1234:整数

我想我会需要使用爆炸,在某些时候破灭,因为奥德的字符操作,我的输入是一个字符串。任何方向将不胜感激。

+0

你能更具体地了解你需要什么样的帮助吗?你的假设*爆炸*和* ord *将是有益的是正确的。 – waldrumpus 2014-10-09 08:55:13

回答

1

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

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

+0

这比我能想出的要简单得多!谢谢!我能写的最终代码如下。 – 2014-10-13 20:50:29

2

鉴于你的问题,我想我可以为你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

+0

这就是我想要做的,任何想法如何做到递归?这是我正在努力的部分。 – 2014-10-09 20:11:11

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

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