2017-02-26 70 views
1

我正在写一个递归ML函数,它接受一个字符串和一个索引值,并将该字符串分割给定索引。该函数应该返回一个包含两个字符串的列表。如何将字符串分为两部分,递归地编写

据我所知,我需要两个基本案例来检查是否已达到索引,另一个检查字符串是否超出字符。我被困在如何将字符分配给不同的字符串。请注意,我使用了一个辅助函数来清除最初的调用,这样在每次函数调用时都不需要输入爆炸。

fun spliatHelp(S, num) = 
    if null S then nil 
    else if num = 0 then hd(S) :: (*string2 and call with tl(S)*) 
    else hd(S) :: (*string1 and call with tl(S)*) 


fun spliat(S, num) = 
    spliatHelp(explode(S), num); 

从spliat(“theString”,3)的输入;

我的理想输出是[“the”,“String”];

回答

2

对于num = 0的情况,您只需要返回[nil, S]或(等同)nil :: S :: nil

对于其他情况,您需要进行递归调用spliatHelp (tl S, num - 1),然后检查结果。您可以根据您的喜好使用let表达式或case表达式。该case表达版本是这样的:

case spliatHelp (tl S, num - 1) 
    of nil => nil (* or however you want to handle this *) 
    | [first, second] => [hd S :: first, second] 
    | raise (Fail "unexpected result") 

顺便说一句,而不是零或两种元素返回string list,我认为这将是更好,更清晰的返回一个(string * string) option。 (或者甚至只是一个string * string,如果索引超出范围,会引发异常。)

相关问题