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

備忘としてのメモを記載

深さ優先探索っぽい順列

reasonMlによる順列
まぁまぁきれいにできた気がする。
終了条件と次のノードのとこをいじればいろいろできるよう抽象化できた。

let permu = (count, lst) => {
  let isFinished = acc => List.length(acc) == count;
  let getNextNode = (cur, l) => List.filter(el => el != cur, l);
// List.filter(el => el > cur, l) にすれば組み合わせになる
  let rec aux = (linkedNode, acc) =>
    if (isFinished(acc)) {
      [acc];
    } else {
      linkedNode
      |> List.map(curNode =>
           aux(getNextNode(curNode, linkedNode), [curNode, ...acc])
         )
      |> List.concat;
    };

  aux(lst, []);
};

let tes5 = permu(3, [1, 2, 3, 4]);

これがパターンマッチ使ってないからそのままjavascriptに書き直せる。
書き直すときreturnのつけ忘れに注意。