C# 使用大写字母和递归c搜索密码

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

我正在尝试做一项任务,在这里我必须搜索密码。输入是lowcase中的字符串,输出是输入字符串中所有区分大小写的字符串。 例如:输入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
我认为你需要好好考虑一下你在这里要做什么:递归部分的作用是什么

以目前的形式,你基本上是在说:

// 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);
    }
}