Что бы не вычислять все комбинации сразу, поиграем со
шрифтами каналами:
func main() {
ch := GenerateAllPerms("абв", 4)
i := 1
for s := range ch {
fmt.Println(i, s)
i++
}
}
// GeneratePermsN выдаёт в канал все комбинации длины n
func GeneratePermsN(ch chan string, chars []string, prefix string, n int) {
for _, char := range chars {
str := prefix + char
if n == 1 {
ch <- str
} else {
GeneratePermsN(ch, chars, str, n-1)
}
}
}
// GenerateAllPerms возвращает канал в который будут записаны все комбинации длины от 1 до n
func GenerateAllPerms(alphabet string, n int) chan string {
ch := make(chan string)
chars := strings.Split(alphabet, "")
go func() {
for i := 1; i <= n; i++ {
GeneratePermsN(ch, chars, "", i)
}
close(ch)
}()
return ch
}
P.S. Наверняка этот код можно улучшить, т.к. на Go я начал учить на этих январских праздниках =)