func Partition(ss []string, k int) (table Table) {
	n := len(ss)
	seed := make([]string, n)
	copy(seed, ss)
	if debug.Value >= 1 {
		fmt.Printf("lib/strings: %s Partition(%v,%v)\n", createIndent(n), n, k)
	}
	if k == 1 {
		list := make(Row, 1)
		list[0] = seed
		table = append(table, list)
		return table
	}
	if n == k {
		return SinglePartition(seed)
	}
	el := seed[0]
	seed = append(seed[:0], seed[1:]...)
	if debug.Value >= 1 {
		fmt.Printf("[tekstus] %s el: %s, seed: %s", createIndent(n), el, seed)
	}
	genTable := Partition(seed, k)
	if debug.Value >= 1 {
		fmt.Printf("[tekstus] %s genTable join: %v", createIndent(n), genTable)
	}
	table = genTable.JoinCombination(el)
	if debug.Value >= 1 {
		fmt.Printf("[tekstus] %s join %s      : %v\n", createIndent(n), el,
			table)
	}
	genTable = Partition(seed, k-1)
	if debug.Value >= 1 {
		fmt.Printf("[tesktus] %s genTable append: %s", createIndent(n), genTable)
	}
	for _, row := range genTable {
		list := make(Row, len(row))
		copy(list, row)
		list = append(list, []string{el})
		table = append(table, list)
	}
	if debug.Value >= 1 {
		fmt.Printf("[tesktus] %s append %v      : %v\n", createIndent(n), el,
			table)
	}
	return table
}
Partition group the each element of slice "ss" into non-empty
record, in such a way that every element is included in one and only of the
record.

Given a list of element in "ss", and number of partition "k", return
the set of all group of all elements without duplication.

Number of possible list can be computed using Stirling number of second kind.

For more information see,

- https://en.wikipedia.org/wiki/Partition_of_a_set
package strings
import (
	"fmt"
	"github.com/shuLhan/share/lib/debug"
)
type Table []Row
func createIndent(n int) (s string) {
	for i := 0; i < n; i++ {
		s += " "
	}
	return
}