【问题标题】:How to split a string in two, recursively如何递归地将字符串一分为二
【发布时间】:2017-07-16 20:30:40
【问题描述】:

我正在编写一个递归 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"];

【问题讨论】:

    标签: list recursion sml smlnj ml


    【解决方案1】:

    对于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 * string) option 不是返回一个包含零个或两个元素的string list,而是返回一个(string * string) option 会更好更清晰。 (或者甚至只是一个string * string,如果索引超出范围就会引发异常。)

    【讨论】:

      猜你喜欢
      • 2019-07-24
      • 1970-01-01
      • 2012-11-16
      • 2014-02-27
      • 2020-12-18
      • 2021-05-17
      • 2011-06-25
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多