院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

nを指定できる順列

let permutation = (num, lst) => {
  let rm = (n, l) => List.filter(el => n != el, l);
  let rec aux = (num, lst, acc) =>
    switch (num) {
    | 0 => [List.rev(acc)]
    | _ =>
      lst
      |> List.fold_left(
           (acc2, el) => acc2 @ aux(num - 1, rm(el, lst), [el, ...acc]),
           [],
         )
    };
  aux(num, lst, []);
};

let test = permutation(5, [1, 2, 3, 4, 5]);

前回のが再帰の基本に忠実だったのに比べると今回は深さ優先探索っぽく動く
深さ優先探索っぽい動きだなって思ったらアキュムレータ使えばうまく実装できるんだな

こっちのほうが汎用性高いし、作るのも楽かもしれない。