Optimization 在OCaml中查找所有更改组合(货币)

Optimization 在OCaml中查找所有更改组合(货币),optimization,recursion,functional-programming,ocaml,Optimization,Recursion,Functional Programming,Ocaml,我有一个OCaml代码,可以找到给定变更量的所有变更组合。我的大部分代码都在工作,但是我无法理解这个递归函数将如何实际返回可能的更改组合 let change_combos presidents = let rec change amount coinlist = match amount with |0 -> [[]] (*exits when nothing*) |_ when (amount < 0) -> [] (*exits when les

我有一个OCaml代码,可以找到给定变更量的所有变更组合。我的大部分代码都在工作,但是我无法理解这个递归函数将如何实际返回可能的更改组合

let change_combos presidents = 
  let rec change amount coinlist =  match amount with 
    |0 -> [[]] (*exits when nothing*)
    |_ when (amount < 0) -> [] (*exits when less than 0*)
    |_ -> match coinlist with
    |[] -> [] (*Returns empty list, exits program*)

(*h::f -> something, using [25;10;5;1] aka all change combinations...*)
(*using recursion, going through all combinations and joining lists returned together*)

let print_the_coin_matrix_for_all_our_joy enter_the_matrix =
print_endline (join "\n" (List.map array_to_string enter_the_matrix));;
让更改\u组合主席=
let rec change amount coinlist=将金额与
|0->[[]](*无内容时退出*)
|_当(金额<0)->[](*小于0*时退出)
|_->将coinlist与
|[]->[](*返回空列表,退出程序*)
(*h::f->something,使用[25;10;5;1]aka-all-change组合…*)
(*使用递归,遍历所有组合并连接一起返回的列表*)
让我们打印硬币矩阵,让我们所有的快乐进入矩阵=
打印尾行(将“\n”(List.map数组连接到字符串输入矩阵);;

谢谢你的帮助,如果我需要澄清一些事情,请告诉我:)

你在找什么有点困惑。我相信您想要生成一个列表的所有组合的列表?您应该考虑递归以及如何生成各个元素。从输入类型开始,以及如何通过减少问题空间来生成连续元素

let rec generate lst = match lst with
  | []   -> []
  | h::t -> [h] :: (List.map (fun x -> h::x) (generate t)) @ (generate t)

如果列表为
[]
,则不存在组合。如果我们有一个元素,我们会生成没有该元素的所有组合,并基于该假设进行构造。此时,组件已就位。将
t
的组合列表与
t
h
cons
'd的组合连接到每个和一个
h
的单子上。这有点混淆了您要查找的内容。我相信您想要生成一个列表的所有组合的列表?您应该考虑递归以及如何生成各个元素。从输入类型开始,以及如何通过减少问题空间来生成连续元素

let rec generate lst = match lst with
  | []   -> []
  | h::t -> [h] :: (List.map (fun x -> h::x) (generate t)) @ (generate t)

如果列表为
[]
,则不存在组合。如果我们有一个元素,我们会生成没有该元素的所有组合,并基于该假设进行构造。此时,组件已就位。将
t
的组合列表与
t
h
cons
'd的组合串联在一起,并将
h

的一个单独的
h

这段代码太零碎了,不能说太多。我想你问的问题的一般答案是,函数是由表达式(带有值的东西)定义的。此值是函数返回的值。但这可能没有帮助:-)也许你可以问一些更具体的问题。所以我想我应该可以这样做:让join concat all_my_lists=List.fold_left(fun x y->x^concat^y)““all_my_lists;”;;让array_to_string array=join“,”(List.map string_of_int array);;但不知道如何实际调用递归函数来返回“change”的所有组合。。。希望这能让它更清楚一点。当您使用
构造嵌套
match…时,有一点建议使用括号。这段代码太零碎了,无法详细说明。我想你问的问题的一般答案是,函数是由表达式(带有值的东西)定义的。此值是函数返回的值。但这可能没有帮助:-)也许你可以问一些更具体的问题。所以我想我应该可以这样做:让join concat all_my_lists=List.fold_left(fun x y->x^concat^y)““all_my_lists;”;;让array_to_string array=join“,”(List.map string_of_int array);;但不知道如何实际调用递归函数来返回“change”的所有组合。。。希望这能让它更清楚一点。当您使用
结构嵌套
match…时,建议使用括号。