在C中生成n个字母组合的总数

时间:2019-04-08 17:13:10

标签: java c++ c algorithm logic

我应该写一个逻辑来生成由n个字母组成的单词的组合。

例如,如果提供了数字2,则我需要从a-z生成所有两个字母的单词,即:

flag = False
while flag = False:
    if condtion:
        flag = True

我知道嵌套循环不足以解决此问题,因为嵌套循环的数量随单词中字母的数量而变化。这使我转向递归,但是我想不出逻辑。

3 个答案:

答案 0 :(得分:4)

递归是这里的关键。这是用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, "");

答案 1 :(得分:0)

两个字母有26 ^ 2个组合,三个字母有26 ^ 3个组合,依此类推-n个字母有26 ^ 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)

答案 2 :(得分:0)

本课的重点是教您递归,这比学究的脸颊更有价值……但要成为一个逆势主义者,如果您愿意,可以完全使用嵌套循环来做到这一点。您可以使用 unnested 循环...

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++;
      }
   }
}