【问题标题】:Recursively get forms of a string递归获取字符串的形式
【发布时间】:2014-02-08 10:04:45
【问题描述】:

我有一个字符串ABC,我正在尝试使用递归来获取它的所有形式。例如,我的目标是让输出看起来像这样:

A
B
C
AB
AC
BC

目前,我遇到了一个问题,我似乎无法弄清楚为什么会这样。当我单步执行我的代码并到达return temp 时,即使该功能已经完成,它也会返回到Passwords(word.Substring(start + 1, end - 1), start + 1, end);。当它这样做时,它会删除我的列表中包含的任何元素。

class Program
    {
        static void Main(string[] args)
        {
            string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\words.txt";
            string text = "abc";
            List<string> passwords = Passwords(text, 0, text.Length);

            foreach (string password in passwords)
            {
                using (StreamWriter writer = new StreamWriter(path))
                {
                    Console.WriteLine(password);
                    writer.WriteLine(password);
                }
            }
        }

        public static List<string> Passwords(string word, int start, int end)
        {
            List<string> temp = new List<string>();
            if (start == end)
            {
                temp.Add(word);
            }

            else if (word.Length == 2)
            {
                char[] input = word.ToCharArray();
                string letter1 = input[0].ToString();
                string letter2 = input[1].ToString();
                string s = letter2 + letter1;
                temp.Add(s);
            }

            else
            {
                if (start < end)
                {
                    Passwords(word.Substring(start + 1, end - 1), start + 1, end);
                }
            }

            return temp;
        }
    }

谁能帮我指出我做错了什么的正确方向?

【问题讨论】:

标签: c# string recursion


【解决方案1】:

我可以看到的主要问题是您的递归调用:您根本没有存储此调用的结果!您可能应该将它们添加到temp 列表中:

temp.AddRange(Passwords(word.Substring(start + 1, end - 1), start + 1, end));

但是整个代码看起来很乱,所以我不确定它是否能正常工作,因为它可能不是唯一的问题。

【讨论】:

  • +1... 看起来应该不仅仅是添加调用结果(缺少前缀)。
  • @AlexeiLevenkov 我很确定整个算法是不正确的。当您已经发送缩小的word 时,我认为您不应该增加start/end!但正如你在评论中所说,关于算法问题有很多问题,所以我不打算深入挖掘。
【解决方案2】:

有很多关于如何做到这一点的例子。

我会考虑检查这些并重构您的代码,因为我认为它需要一些更改(就像@Alexei Levenkov 所说 - 您的返回值有问题)。

你可以查看this example如何做到这一点,以及很好的解释here

【讨论】:

    【解决方案3】:

    听起来您想要从源文本中删除字符的每种组合。您不想重新排列,只需返回所有有序子集。

    如果是这样,这可能会满足您的要求:

    public IEnumerable<string> GetAllInstrings(string text)
    {
        yield return text.Substring(0, 1);
        if (text.Length > 1)
        {
            foreach (var element in GetAllInstrings(text.Substring(1)))
            {
                yield return element;
                yield return text.Substring(0, 1) + element;
            }
        }
    }
    

    我从“ABC”得到以下结果。

    A 
    B 
    AB 
    C 
    AC 
    BC 
    ABC 
    

    【讨论】:

    • 谢谢,这正是我想要做的。我把这个问题复杂化了。
    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 2020-06-04
    • 2015-05-13
    • 1970-01-01
    • 2021-06-24
    • 2011-05-15
    • 2018-07-19
    相关资源
    最近更新 更多