foreach 循环仅适用于 yield return,您在 GetSequences() 方法中的 GetSequences() 命令上没有 yield return;它返回的任何东西都不会被存储或返回。就像你在做这个: 就像你在做这个:
static IEnumerable<string> GetSequences(string a)
{
GetSequences(a + ">");
}
这当然没有 return 语句(它不会编译,但你知道)。在玩了一会儿之后,如果您想使用递归,我建议您不要使用可枚举,特别是因为循环和递归旨在服务于不同的目的,而带有 IEnumerable 的 foreach 最适合具有已经列举了。上面建议的循环原样只启用无限递归,并实现递归的转义,如下所示:
static IEnumerable<string> GetSequences(string a)
{
if(a.Length > 100)
yield return a;
else
foreach (var n in GetSequences(a + ">"))
yield return n;
}
产生这个输出:(
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,
也许按比例缩放,我不想数)通过这样实现它,我能够得到你想要的输出:
static string GetSequences(string a, int len)
{
if (a.Length < len)
{
return GetSequences(a + ">", len);
}
else
return a;
}
static void Main(string[] args)
{
for (int i = 1; i < 5; i++)
{
Console.Write(GetSequences(">", i) + ",");
}
Console.Read();
}
当然,我的整数是任意的,它适用于任何长度。
编辑:我知道有一种方法可以按照 abatishchev 所说的方式进行,但我想不通。在绞尽脑汁之后,这是我得到的:
static IEnumerable<string> GetSequences(string a)
{
if (a.Length < 100)
{
yield return a;
foreach (var n in GetSequences(a + ">"))
yield return n;
}else
yield break;
}
这有你想要的输出,虽然我仍然认为使用循环递归有点有趣。