Go言語でスライスの順列を取得する

とりあえず書いてみて動いたのでメモしておく。

package main

import "fmt"

// リストからidx番目の要素を抜かしたものを取得
func delete(idx int, L []interface{}) (result []interface{}) {
	result = append(result, L[:idx]...)
	result = append(result, L[idx+1:]...)
	return
}

// sliceの全組み合わせを返す
func Permute(L []interface{}) (result [][]interface{}) {

	var inner func(LL []interface{})

	inner = func(LL []interface{}) {
		if len(LL) == 0 {
			result = append(result, []interface{}{}) //
		}
		for idx, r := range L {
			for _, t := range Permute(delete(idx, L)) {
				result = append(result, append([]interface{}{r}, t...))
			}
		}
	}
	inner(L)
	return

}

func main() {
	for _, l := range Permute([]interface{}{'a', 'b', 'c'}) {

		result := make([]rune, len(l))
		for i, e := range l {
			result[i] = e.(rune)
		}
		fmt.Println(string(result))
	}
}
abc
acb
bac
bca
cab
cba