深さ優先探索っぽい順列
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のつけ忘れに注意。