#go #recursion
#Вперед #рекурсия
Вопрос:
У меня есть пример рекурсивного кода в go playground, есть 2 «?», цель состоит в том, чтобы сгенерировать все двоичные строки, заменяющие? при 0 или 1 предполагается отображение 4 результатов, но отображается только 3. т. Е. отсутствует 1100101
package main
import (
"fmt"
//"strings"
//"strconv"
)
func main() {
str := "1?0?101"
mstr := []byte(str)
q := []byte("?")[0]
a := []byte("0")[0]
b := []byte("1")[0]
fmt.Println(mstr)
allstr(mstr, 0, len(mstr), q, a, b)
}
func allstr(mstr []byte, index int, size int, q, a, b byte) {
if index >= size {
fmt.Println(string(mstr))
return
}
if mstr[index] == q {
mstr[index] = a
allstr(mstr, index 1, size, q, a, b)
mstr[index] = b
allstr(mstr, index 1, size, q, a, b)
} else {
allstr(mstr, index 1, size, q, a, b)
}
}
Перейти на игровую площадку:https://play.golang.org/p/4e5NIOS9fG4
Вывод:
[49 63 48 63 49 48 49]
1000101
1001101
1101101
Комментарии:
1. Как вы думаете, почему это должно отображать 8 результатов? Чего должен достичь код?
2. Я немного обновил код, чтобы предположить отображение 4, но отображать только 3. добавьте недостающее в вопрос . спасибо, Джим
Ответ №1:
Вам необходимо отменить записи в фрагмент главного байта во время рекурсивного отслеживания:
if mstr[index] == q {
mstr[index] = a
allstr(mstr, index 1, size, q, a, b)
mstr[index] = b
allstr(mstr, index 1, size, q, a, b)
mstr[index] = q // <--- add this
}