我将类型“单词”定义为字符列表。我正在尝试编写一个递归函数“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:
你快到了。在模式匹配的最后一种情况下,您可以正确计算所有三元组,其中从第二个到最后一个字符的任何字符用作分隔符,但您还必须将第一个字符(即h
)作为分隔符的情况添加到该列表中(因此前缀为空,后缀为t
)。
一旦完成,您可能会注意到h::[]
案例实际上是h::t
的一个特例,因此不需要以自己的模式区分开来。