Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 递归地获取字符串的形式_C#_String_Recursion - Fatal编程技术网

C# 递归地获取字符串的形式

C# 递归地获取字符串的形式,c#,string,recursion,C#,String,Recursion,我有一个字符串ABC,我试图用递归得到它的所有形式。例如,我的目标是使输出如下所示: A B C AB AC BC 目前,我遇到了一个问题,我似乎不明白为什么它会这样做。当我一步一步地浏览我的代码并到达return temp时,它会返回到密码(word.Substring(start+1,end-1),start+1,end)即使函数已完成。当它这样做时,它会删除我的列表中包含的所有元素 class Program { static void Main(string[]

我有一个字符串
ABC
,我试图用递归得到它的所有形式。例如,我的目标是使输出如下所示:

A
B
C
AB
AC
BC
目前,我遇到了一个问题,我似乎不明白为什么它会这样做。当我一步一步地浏览我的代码并到达
return temp
时,它会返回到
密码(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;
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
字符串路径=Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+“\\words.txt”;
string text=“abc”;
列出密码=密码(text,0,text.Length);
foreach(密码中的字符串密码)
{
使用(StreamWriter=新StreamWriter(路径))
{
控制台写入线(密码);
writer.WriteLine(密码);
}
}
}
公共静态列表密码(字符串字、整数开始、整数结束)
{
列表温度=新列表();
如果(开始==结束)
{
临时添加(word);
}
else if(word.Length==2)
{
char[]输入=word.ToCharArray();
字符串letter1=输入[0]。ToString();
string letter2=输入[1]。ToString();
字符串s=字母2+字母1;
临时添加;
}
其他的
{
如果(开始<结束)
{
密码(word.Substring(start+1,end-1),start+1,end);
}
}
返回温度;
}
}

有人能帮我指出我做错了什么吗?

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

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

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

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

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

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

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

我会考虑检查这些代码并重构代码,因为我认为它需要一些改变(比如@ Alexei Levenkov说,返回值有问题)。
您可以查看如何执行此操作,并给出很好的解释。关于如何执行此操作,有许多示例

我会考虑检查这些代码并重构代码,因为我认为它需要一些改变(比如@ Alexei Levenkov说,返回值有问题)。
您可以检查如何做到这一点,并给出很好的解释。

听起来您希望从源文本中删除所有字符组合。您不想重新排列,只需返回所有按顺序排列的子集即可

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

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

听起来好像你想要从源文本中删除所有字符的组合。您不想重新排列,只需返回所有按顺序排列的子集即可

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

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

应该有很多“如何生成XXXXX的所有排列”问题。。。这里有一些。。。还有,应该有很多“如何生成XXXXX的所有排列”的问题。。。这里有一些。。。和+1。。。而且看起来应该不仅仅是添加调用结果(缺少前缀)。@AlexeiLevenkov我很确定整个算法都是错误的。我认为当你已经发送了压缩的
单词时,你不应该增加
开始
/
结束
!但正如你在评论中所说,关于算法问题有很多问题,所以我不打算深入挖掘。。。而且看起来应该不仅仅是添加调用结果(缺少前缀)。@AlexeiLevenkov我很确定整个算法都是错误的。我认为当你已经发送了压缩的
单词时,你不应该增加
开始
/
结束
!但正如你在评论中所说,关于算法问题有很多问题,所以我不打算深入挖掘。谢谢你,这正是我想要做的。我把这个问题复杂化了。谢谢,这正是我想做的。我把这个问题复杂化了。