OCaml:如何在特定条件下生成置换?
在这里,我仍在学习有关OCaml的更多信息,但我正在研究一种方法,该方法将比较OCaml中的两个字符串列表。第一个列表是要比较的字符串列表。然后,第二个列表将是一个字符串,该字符串可能是单词,也可能不是单词,但必须生成置换,直到它创建了第一个列表中存在的单词。比如说, 列表1:OCaml:如何在特定条件下生成置换?,ocaml,permutation,Ocaml,Permutation,在这里,我仍在学习有关OCaml的更多信息,但我正在研究一种方法,该方法将比较OCaml中的两个字符串列表。第一个列表是要比较的字符串列表。然后,第二个列表将是一个字符串,该字符串可能是单词,也可能不是单词,但必须生成置换,直到它创建了第一个列表中存在的单词。比如说, 列表1:[“你好”;“那里”] 清单2:[“hlleo”] 列表2应该生成置换,直到它与列表1中的字符串匹配为止。我似乎无法创建一个条件,使其在需要时停止生成置换,也无法获得正确的类型。我已经看遍了所有的地方,虽然我可以生成排列,
[“你好”;“那里”]
清单2:[“hlleo”]
列表2应该生成置换,直到它与列表1中的字符串匹配为止。我似乎无法创建一个条件,使其在需要时停止生成置换,也无法获得正确的类型。我已经看遍了所有的地方,虽然我可以生成排列,但它并不能完全满足我的需要,我不知所措。这就是我到目前为止所做的:
let rec implode : char list -> string = function
| [] -> ""
| c::cs -> String.make 1 c ^ implode cs
let is_word_in word lst = List.mem word lst
let rec interleave x lst =
match lst with
| [] -> [[x]]
| hd::tl -> (x::lst) :: (List.map (fun y -> hd::y) (interleave x tl))
let rec permutations str lst accum=
match str with
| hd::tl -> let perm = List.concat (List.map (interleave hd) (permutations tl lst)) in
if is_word_in (implode(perm)) lst then (implode(perm))::accum else perm
| _ -> [str]
任何形式的帮助或指导都将不胜感激 为了将任务划分为更小、更简单的任务,我将尝试采用以下方法
排列
仅打印每个排列,不执行其他操作permutations
还返回布尔值)None
值进行迭代。换句话说,函数F可以返回None
或Some'a
,但现在不需要处理Some
情况'a
的累加器。用累加器和置换调用F。F返回
一些新的或没有。置换
的返回类型也是一个选项以下是我将尝试的方法,以便将任务划分为更小、更简单的任务
排列
仅打印每个排列,不执行其他操作permutations
还返回布尔值)None
值进行迭代。换句话说,函数F可以返回None
或Some'a
,但现在不需要处理Some
情况'a
的累加器。用累加器和置换调用F。F返回
一些新的或没有。置换
的返回类型也是一个选项如果您只想知道第一个列表中是否存在字符串
s
的某种排列,则更快的方法是将第一个列表中每个字符串的字符按已知顺序排序。然后对s
的字符进行排序,并在重新排序的字符串列表中进行一次成员资格测试。没有必要产生排列。哇,我不知道为什么我没有想到这一点。非常感谢你!!这为我的程序节省了很多时间!如果您只想知道第一个列表中是否存在字符串s
的某种排列,则更快的方法是将第一个列表中每个字符串的字符按已知顺序排序。然后对s
的字符进行排序,并在重新排序的字符串列表中进行一次成员资格测试。没有必要产生排列。哇,我不知道为什么我没有想到这一点。非常感谢你!!这为我的程序节省了很多时间!