OCaml:如何在特定条件下生成置换?

OCaml:如何在特定条件下生成置换?,ocaml,permutation,Ocaml,Permutation,在这里,我仍在学习有关OCaml的更多信息,但我正在研究一种方法,该方法将比较OCaml中的两个字符串列表。第一个列表是要比较的字符串列表。然后,第二个列表将是一个字符串,该字符串可能是单词,也可能不是单词,但必须生成置换,直到它创建了第一个列表中存在的单词。比如说, 列表1:[“你好”;“那里”] 清单2:[“hlleo”] 列表2应该生成置换,直到它与列表1中的字符串匹配为止。我似乎无法创建一个条件,使其在需要时停止生成置换,也无法获得正确的类型。我已经看遍了所有的地方,虽然我可以生成排列,

在这里,我仍在学习有关OCaml的更多信息,但我正在研究一种方法,该方法将比较OCaml中的两个字符串列表。第一个列表是要比较的字符串列表。然后,第二个列表将是一个字符串,该字符串可能是单词,也可能不是单词,但必须生成置换,直到它创建了第一个列表中存在的单词。比如说,

列表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] 

任何形式的帮助或指导都将不胜感激

为了将任务划分为更小、更简单的任务,我将尝试采用以下方法

  • 写入
    排列
    仅打印每个排列,不执行其他操作
  • 测试此功能是否正常工作
  • 不打印置换,而是添加一个新参数F,该函数接受置换并返回true或false;当返回值为false时,停止生成置换;您需要让这些信息在递归调用中冒泡(
    permutations
    还返回布尔值)
  • 重写以使用选项类型,而不是布尔值;停止对
    None
    值进行迭代。换句话说,函数F可以返回
    None
    Some'a
    ,但现在不需要处理
    Some
    情况
  • 添加参数a,即类型为
    'a
    的累加器。用累加器和置换调用F。F返回 一些新的或没有。
    置换
    的返回类型也是一个选项
  • 您可以编写一个函数来检查回文是否符合某些条件,并在此时停止迭代。但是请注意,当您停止迭代时,不会返回累加器的当前值。如果提前退出,如何返回蓄能器

  • 以下是我将尝试的方法,以便将任务划分为更小、更简单的任务

  • 写入
    排列
    仅打印每个排列,不执行其他操作
  • 测试此功能是否正常工作
  • 不打印置换,而是添加一个新参数F,该函数接受置换并返回true或false;当返回值为false时,停止生成置换;您需要让这些信息在递归调用中冒泡(
    permutations
    还返回布尔值)
  • 重写以使用选项类型,而不是布尔值;停止对
    None
    值进行迭代。换句话说,函数F可以返回
    None
    Some'a
    ,但现在不需要处理
    Some
    情况
  • 添加参数a,即类型为
    'a
    的累加器。用累加器和置换调用F。F返回 一些新的或没有。
    置换
    的返回类型也是一个选项
  • 您可以编写一个函数来检查回文是否符合某些条件,并在此时停止迭代。但是请注意,当您停止迭代时,不会返回累加器的当前值。如果提前退出,如何返回蓄能器

  • 如果您只想知道第一个列表中是否存在字符串
    s
    的某种排列,则更快的方法是将第一个列表中每个字符串的字符按已知顺序排序。然后对
    s
    的字符进行排序,并在重新排序的字符串列表中进行一次成员资格测试。没有必要产生排列。哇,我不知道为什么我没有想到这一点。非常感谢你!!这为我的程序节省了很多时间!如果您只想知道第一个列表中是否存在字符串
    s
    的某种排列,则更快的方法是将第一个列表中每个字符串的字符按已知顺序排序。然后对
    s
    的字符进行排序,并在重新排序的字符串列表中进行一次成员资格测试。没有必要产生排列。哇,我不知道为什么我没有想到这一点。非常感谢你!!这为我的程序节省了很多时间!