Генерация общего числа n-буквенных комбинаций алфавита в C - PullRequest
0 голосов
/ 08 апреля 2019

Я должен написать логику для генерации комбинации n-буквенных слов.

Например, если указано число 2, я должен сгенерировать все двухбуквенные слова из a-z, т.е.:

    aa-ba-ca.....za
    ab-bb-cb.....zb
    .
    .
    .
    .
    az-bz........zz

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

Ответы [ 3 ]

4 голосов
/ 08 апреля 2019

Рекурсия - вот ключ. Вот пример, написанный на Java:

public static void printCombos(int totalWords, String s) {
    if(totalWords-- <= 0) {
        System.out.print(s + " ");
        return;
    }
    for(char i = 'a'; i <= 'z'; i++)
        printCombos(totalWords, s + Character.toString(i));
    System.out.println();
}

Вызвать его:

printCombos(2, "");
0 голосов
/ 09 апреля 2019

Смысл этого урока в том, чтобы научить вас рекурсии, которая гораздо более ценна, чем педантичная щека ... но просто для того, чтобы быть противоположностью, вы можете сделать это с помощью вложенных циклов, если хотите.Вы можете сделать это с помощью unnested loop ...

void up_to_n_letters(int n)
{
   char word[n];
   int i = 0;

   for (char letter = 'a'; i < n; letter++) {
      word[i] = letter;
      printf("%s,\n", word);
      if (letter == 'z') {
         letter = 'a' - 1;
         i++;
      }
   }
}
0 голосов
/ 08 апреля 2019

Существует 26 ^ 2 комбинации для двух букв, 26 ^ 3 комбинации для трех букв и т. Д. - 26 ^ n комбинаций для n букв

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

Python-подобный псевдокод:

result = [""] * n
for i in range(26**n):
    t = i
    for k in range(n):
         digit = t % 26
         result[k] = letter[digit]   #"a" for 0, "b" for 1 etc
         t = t // 26 
    print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...