我应该写一个逻辑来生成由n个字母组成的单词的组合。
例如,如果提供了数字2,则我需要从a-z生成所有两个字母的单词,即:
flag = False
while flag = False:
if condtion:
flag = True
我知道嵌套循环不足以解决此问题,因为嵌套循环的数量随单词中字母的数量而变化。这使我转向递归,但是我想不出逻辑。
答案 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++;
}
}
}