簡體   English   中英

使用遞歸C#以大寫字母搜索密碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM