【问题标题】:Generating total number of n-lettered alphabet combinations in C在 C 中生成 n 个字母组合的总数
【发布时间】:2019-04-08 17:13:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • 想想你将如何在 n=1 的情况下实现它。然后考虑如何在 n=2 的情况下实现这一点,给出 n=1 的结果。然后将其扩展为一般的 n。
  • 为什么这个标签是language-agnostic,而你却在标题中注明in C
  • @GuyCoder 标题有C,但问题被标记为Java

标签: c algorithm logic


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    两个字母有 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)
    

    【讨论】:

      【解决方案3】:

      这节课的重点是教你递归,它比迂腐的脸蛋更有价值……但作为一个逆势者,如果你愿意,你完全可以用嵌套循环来做到这一点。你可以用 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++;
            }
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多