同じものを含む順列(重複除去)

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 )

imabari.hateblo.jp
imabari.hateblo.jp