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我很确定整个算法都是错误的。我认为当你已经发送了压缩的单词时,你不应该增加开始
/结束
!但正如你在评论中所说,关于算法问题有很多问题,所以我不打算深入挖掘。谢谢你,这正是我想要做的。我把这个问题复杂化了。谢谢,这正是我想做的。我把这个问题复杂化了。