为什么一个有yield return的函数不能是递归的
本文关键字:return 函数 不能 递归 yield 一个 为什么 | 更新日期: 2023-09-27 18:11:06
我有一段像这样的代码
class Program
{
static IEnumerable<string> GetSequences(string a)
{
yield return a;
GetSequences(a + ">");
}
static void Main(string[] args)
{
foreach (var n in GetSequences(">"))
Console.Write(n + ",");
}
}
我期待这样的输出
,>>,>>>
,但它没有。它只打印">,"。有没有人知道我错过了什么?
使用相同的foreach in函数:
static IEnumerable<string> GetSequences(string a)
{
yield return a;
foreach (var n in GetSequences(a + ">"))
yield return n;
}
foreach循环只适用于yield返回,并且您在GetSequences()方法中的GetSequences()命令上没有yield返回;不管它返回什么,都不会被存储或返回。就像你在做这个:就像你在做这个:
static IEnumerable<string> GetSequences(string a)
{
GetSequences(a + ">");
}
当然没有返回语句(它不会编译,但您知道)。在摆弄了一会儿之后,如果你想使用递归,我建议你不要使用enumerable,特别是因为循环和递归的目的是不同的,而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;
}
这是您想要的输出,尽管我仍然认为使用递归循环有点有趣。