首页 > 解决方案 > 如何在 CAML 中将字符列表(表示单词)划分为所有可能的(前缀、单个字母、后缀)三元组?

问题描述

我将类型“单词”定义为字符列表。我正在尝试编写一个递归函数“divide_word”,它将一个“单词”作为参数并返回“单词”的所有可能(前缀、单字母、后缀)组合的三元组列表。

OCAML 中的执行示例:

assert( divide_word ['c';'o';'d';'e'] = [  ([],'c',['o';'d';'e']) ; (['c'],'o',['d';'e']) ; (['c','o'],'d',['e']) ; (['c','o','d'],'e',[])  ];;

我试过编写函数,但它只返回最后可能的组合。我知道我必须找到一种方法来返回一个实际列表而不仅仅是一个三元组,我尝试连接并编写一个单独的函数。

这是我写的代码:

type word = char list;;

let rec divide_word (w:word) : (word*char*word) list =
  match w with
  |[] -> []
  |h::[] -> [([],h,[])]
  |h::t -> List.map (fun (fir,sec,th) -> (h::fir,sec,th)) (divide_word t);;

帮助!C:

标签: recursionpattern-matchingocaml

解决方案


您快到了。在模式匹配的最后一种情况下,您可以正确计算所有三元组,其中从第二个到最后一个的任何字符都用作分隔符,但您还必须在该列表中添加第一个字符(即h)是分隔符的情况(因此前缀为空,后缀为t)。

完成此操作后,您可能会注意到该案例h::[]实际上是 的一个特定案例h::t,因此无需按照自己的模式分开处理。


推荐阅读