Количество k-комбинаций для всех N - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь написать алгоритм, который возвращает массив всех возможных комбинаций для значений 0, 1 и 2 для длины n.

Например, где n = 2:

00

01

02

10

11

12

20

21

22

Код, который я начал, но далек от правильного или законченного:

func main() {
    var results []string
    matches := rangeSlice(2)

    for a := 0; a < len(matches); a++ {
        for b := 0; b < 3; b++ {
            matches[(len(matches) - a) - 1] = b
            results = append(results, strings.Join(convertValuesToString(matches), ""))
        } 
    }

    printResults(results)
}

Ваша помощь будет высоко ценится!

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Вот реализация решения Ричи (подсчет).(Выходные данные представлены в виде 2D-среза, каждый срез представляет собой комбинацию.)

Для получения выходного примера, getCombinations(3, 2).

func getCombinations(base, length int) [][]int {
    // list of combinations always includes the zero slice
    combinations := [][]int{make([]int, length)}
    current := make([]int, length)
    for {
        incrementIndex := length - 1
        // zero trailing <base - 1>'s
        for current[incrementIndex] == base-1 {
            current[incrementIndex] = 0
            incrementIndex--
            // stop when the next digit to be incremented is "larger"
            // than the specified (slice) length
            if incrementIndex < 0 {
                return combinations
            }
        }
        // increment the least significant non-<base - 1> digit
        current[incrementIndex]++
        // copy current into list of all combinations
        combinations = append(combinations, append([]int{}, current...))
    }
}
0 голосов
/ 24 декабря 2018

Попробуйте этот код!

Код:

n = int(input("Enter value of n :"))
result=[]
for num1 in range(0,n+1):
    for num2 in range(0,n+1):
        result.append(str(num1)+str(num2))
print(result)

Вывод:

Enter value of n :3                                                                                                    
['00', '01', '02', '03', '10', '11', '12', '13', '20', '21', '22', '23', '30', '31', '32', '33']
0 голосов
/ 24 декабря 2018

Это просто счет (в базе k ).Вы можете сделать это - преобразовать последовательные целые числа в основание k - но это много делений и остатков, так что вы могли бы также использовать более простой подход.

  1. Startс n 0s, а затем повторите столько раз, сколько сможете:
  2. Измените все конечные значения k -1 на 0, затем добавьте 1 к предыдущему элементу.Если предыдущего элемента нет, все готово.

Если это поможет понять, вы можете попробовать это с k = 10, что является обычным десятичным счетом.Например:

  • 3919 → изменить трейлинг 9 на 0, добавить один к 1, результат 3920
  • 3920 → нет девяток в конце, добавить один к 0, результат 3921
  • ...
  • 3999 → измените три конечных 9 на 0, добавьте один к 3, результат 4000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...