C# 使用大写字母和递归c搜索密码
我正在尝试做一项任务,在这里我必须搜索密码。输入是lowcase中的字符串,输出是输入字符串中所有区分大小写的字符串。 例如:输入ab42,输出ab42,ab42,ab42,ab42。 我已经这样做了,但是我在递归方面有问题,有人能帮我吗?谢谢C# 使用大写字母和递归c搜索密码,c#,recursion,C#,Recursion,我正在尝试做一项任务,在这里我必须搜索密码。输入是lowcase中的字符串,输出是输入字符串中所有区分大小写的字符串。 例如:输入ab42,输出ab42,ab42,ab42,ab42。 我已经这样做了,但是我在递归方面有问题,有人能帮我吗?谢谢 class Program { static void Main(string[] args) { var res = AlternateCharCases("cat"); foreach (var r i
class Program
{
static void Main(string[] args)
{
var res = AlternateCharCases("cat");
foreach (var r in res)
Console.WriteLine(r);
Console.ReadKey();
}
public static List<string> AlternateCharCases(string lowercaseWord)
{
var result = new List<string>();
AlternateCharCases(lowercaseWord.ToCharArray(), 0, result);
return result;
}
static void AlternateCharCases(char[] word, int startIndex, List<string> result)
{
if (startIndex == word.Length)
{
var d = new char[word.Length];
Array.Copy(word, d, word.Length);
result.Add(new string(d));
result.Sort();
result = result.Distinct().ToList();
return;
}
for (int i = 0; i < word.Length; i++)
{
word[i] = Char.ToUpper(word[i]);
AlternateCharCases(word, startIndex + 1, result);
}
}
}
您可以尝试以下方法:
public static IEnumerable<string> AlternateCharCases(string lowercaseWord)
{
if (lowercaseWord.Length == 1)
{
yield return lowercaseWord;
yield return lowercaseWord.ToUpper();
}
else
{
foreach (var nested in AlternateCharCases(lowercaseWord.Substring(1)))
{
yield return lowercaseWord.Substring(0, 1) + nested;
yield return lowercaseWord.Substring(0, 1).ToUpper() + nested;
}
}
}
您的示例代码告诉我:
cat
Cat
cAt
CAt
caT
CaT
cAT
CAT
我认为你需要好好考虑一下你在这里要做什么:递归部分的作用是什么 以目前的形式,你基本上是在说:
// Pseudocode
A:
if (startIndex == len(word))
{
return SortedDistinctList();
}
foreach (char in word)
{
word.SetCharToUppercase(char);
startIndex++;
Goto A:
}
这不是真正的递归。我没有运行它,但我认为在区分之后,您将只使用一个大写单词。问题的一部分是,您试图将递归与foreach循环混合,但您试图让foreach循环完成所有工作
递归就是把问题分解成可重复的块,知道什么时候停止称自己为中断条件。这里可重复的工作是使字母大写或小写,递归是遍历单词,为每个字符建立大写和小写版本。当我们到达单词的末尾时,我们可以返回该版本,这样程序流就可以沿着递归树的另一个分支下降,并完成更多的块
你可以这样想:
您必须遍历每个分支,当您到达叶节点时,将该单词添加到列表中
尝试这样的方法我将把它留给您作为将伪代码转换为C的练习:
// Pseudocode
static void AlternateCharCases(char[] word, int index, List<string> result)
{
// This is our recursive "break" condition - we return each time a word is added
// to the list, NOT just when we have finished compiling the list
if (startIndex == len(word))
{
AddWordToList(word);
return; // This goes up 1 level of recursion, NOT necessarily back to the top
}
else
{
// Keep lowercase for this char and keep traversing:
AlternateCharCases(word, index + 1, result);
// Now uppercase this char and keep traversing:
SetCharToUpper(word, index);
AlternateCharCases(word, index + 1, result);
}
}
请添加有关递归问题的详细信息。abcDef123的输出将是什么?为什么使用递归?你最好把它放在for循环中,特别是当你需要运行很多次的时候。您说这是一个密码-您是在尝试对彩虹表的每个大小写字符组合进行散列还是强制执行?如果是这样,您将需要一个更快的算法。因为,如果您只是尝试进行字符串比较以匹配任何大小写,则有更有效的方法。@pcdev这是理解递归的任务,我需要使用它。@J.SMTBCJ15输入字符串只能在LowCase中。我只想更改最后一个方法的大小写body@Alexandr-我会考虑不使用它。方法签名相当笨拙。你使用int startIndex很难找到正确的答案,因为它添加的单词比需要的要多。Thx,我已经做了并发布了,但是请把你的答案标记为正确的答案!
"cat"
____^____
__ c C__
/ \ / \
a A a A
/ \ / \ / \ / \
t T t T t T t T
// Pseudocode
static void AlternateCharCases(char[] word, int index, List<string> result)
{
// This is our recursive "break" condition - we return each time a word is added
// to the list, NOT just when we have finished compiling the list
if (startIndex == len(word))
{
AddWordToList(word);
return; // This goes up 1 level of recursion, NOT necessarily back to the top
}
else
{
// Keep lowercase for this char and keep traversing:
AlternateCharCases(word, index + 1, result);
// Now uppercase this char and keep traversing:
SetCharToUpper(word, index);
AlternateCharCases(word, index + 1, result);
}
}