如何将字符串拆分为两个,递归

时间:2017-02-26 05:50:56

标签: list recursion sml smlnj ml

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

据我所知,我需要两个基本情况,一个用于检查是否已到达索引,另一个用于检查字符串是否超出字符。我被困在如何将字符分配给不同的字符串。注意,我使用辅助函数来清理初始调用,因此不需要在每个函数调用时键入explode。

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”];

1 个答案:

答案 0 :(得分: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,如果索引超出界限则引发异常。)