[英]Search password with letters in uppercase with recursion c#
我正在嘗試執行任務,我必須在其中搜索密碼。 輸入是小寫的字符串,輸出是輸入字符串中所有區分大小寫的字符串。 例如:輸入“ ab42”,輸出“ ab42”,“ aB42”,“ Ab42”,“ AB42”。 我已經做到了,但是遞歸有問題,有人可以幫我嗎? 謝謝。
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
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, lowercaseWord.ToCharArray(), 0, result);
result = result.Distinct().ToList();
return result;
}
static void AlternateCharCases(string initialWord, char[] word, int startIndex, List<string> result)
{
if (startIndex == word.Length)
result.Add(new string(word));
else
{
if(!Char.IsLetter(initialWord[startIndex]))
{
word[startIndex] = initialWord[startIndex];
AlternateCharCases(initialWord, word, startIndex + 1, result);
}
else
{
word[startIndex] = initialWord[startIndex];
AlternateCharCases(initialWord, word, startIndex + 1, result);
word[startIndex] = Char.ToUpper(initialWord[startIndex]);
AlternateCharCases(initialWord, word, startIndex + 1, result);
}
}
}
}
我認為您需要仔細考慮您要在這里做什么:遞歸部分是做什么的?
在當前形式下,您基本上是在說:
// Pseudocode
A:
if (startIndex == len(word))
{
return SortedDistinctList();
}
foreach (char in word)
{
word.SetCharToUppercase(char);
startIndex++;
Goto A:
}
那不是真正的遞歸。 我還沒有運行它,但是我認為在Distinct
之后,您只會得到一個大寫單詞。 問題的一部分是您試圖將遞歸與foreach
循環混合使用,但是您試圖使自己的foreach
循環完成所有工作。
遞歸是關於(a)將問題分解為可重復的塊,以及(b)知道何時停止打電話給自己(“中斷”條件)。 此處可重復的工作是使字母變成大寫或小寫,並且遞歸遍歷該單詞,從而為每個字符同時建立了大寫和小寫形式。 當我們到達單詞的末尾時,我們可以返回該“版本”,以便程序流可以向下遞歸樹的另一個分支,並完成其他塊。
這樣想:
"cat" ____^____ __ c C__ / \\ / \\ a A a A / \\ / \\ / \\ / \\ t T t T t T t T
您必須遍歷每個分支,並在到達葉節點時,將該單詞添加到列表中。
嘗試這樣的事情(我將把它作為將偽代碼轉換為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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.