мне надо все комбинации букв и сочетания. например есть последовательность "абв" и максимальное количество символов 4. я хочу
а
б
в
aa
аб
ав
ба
бб
бв
....
ввва
вввб
вввв
Тоесть типа
func validCombinations(alphabet string, maxChar int) bool {
}
// передаем возможные символы и максимальную длину
validCombinations("абв", 4)
и функция проходит по всем комбинациям
Я что-то искал пример. даже на других языках. но все пермутации, комбинации они почему то реализовываются заданной длины а я хочу разной длины - от 1 символа до макс количества.
Может есть реализации на других языках. я бы мог адаптировать под go.
Понимаю что тут два варианта - рекурсия или цикл. я бы очень хотел реализовать в цикле без рекурсии. важна производительность
PS. пока есть такая жуткая реализация которую сам сочинил. получается я что то вроде собственной системы счисления делаю и перевожу цифры в символы
func checkCombinations(alphabet string, length int) {
countChars := len(alphabet)
elems := make([]string, countChars)
for i, r := range alphabet {
elems[i] = string(r)
}
var current int
base := float64(countChars)
baseLog := math.Log(float64(countChars))
for float64(current) < math.Pow(base, float64(length)) {
if current < countChars {
println(elems[current])
} else {
var combo string
x := float64(current)
size := int(math.Log(float64(current)) / baseLog)
for size >= 0 {
oneReg := math.Pow(base, float64(size))
number := int(x / oneReg)
x = x - oneReg*float64(number)
combo = combo + elems[number]
size--
}
println(combo)
}
current++
}
}