http://osami.s280.xrea.com/Algo_Data2015/Presen/Algorithm08.pdf
こちらの順列を参考に
function perm(head, rest) { if (rest.length === 0) { return [head]; } else { var res = []; //重複削除 var data = rest.filter(function (x, y, self) { return self.indexOf(x) === y; }); for (var i = 0; i < data.length; i++) { //配列の複製 var restx = rest.slice(0); //指定データ削除 for (var j = 0; j < restx.length; j++) { if (restx[j] == data[i]) { restx.splice(j, 1); break; } } var headx = head.concat(data[i]); res = res.concat(perm(headx, restx)); } return res; } } var data = perm([], [1, 1, 1, 2, 2, 3]); //順列の個数 Logger.log(data.length); //順列 Logger.log(data);
Pythonならもっとシンプル
def perm(head ,rest): if len(rest) == 0: return [head] else: res = [] # set(集合)型で重複を削除、ソート data = sorted(set(rest)) for i in data: #配列の複製 restx = rest[:] #指定データ削除 restx.remove(i) headx = head + [i] res += perm(headx, restx) return res junretsu = perm([],[1, 1, 1, 2, 2, 3]) #順列の個数 print( len(junretsu) ) #順列 print( junretsu )