我有一些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));;
感谢您的帮助,请告诉我是否需要澄清一些事情:)
答案 0 :(得分:1)
你正在寻找的东西有点令人困惑。我相信你想生成一个列表的所有组合的列表?您应该考虑递归以及如何生成单个元素。从输入类型开始,以及如何通过减少问题空间来生成连续元素。
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
的每个和单个。{/ p>