C# 为什么一个有收益的函数不能递归?
我有一段这样的代码C# 为什么一个有收益的函数不能递归?,c#,recursion,yield-return,C#,Recursion,Yield Return,我有一段这样的代码 class Program { static IEnumerable<string> GetSequences(string a) { yield return a; GetSequences(a + ">"); } static void Main(string[] args) { foreach (var n in GetSequences(">"))
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:
static IEnumerable<string> GetSequences(string a)
{
yield return a;
foreach (var n in GetSequences(a + ">"))
yield return n;
}
不要忘记退出递归。foreach循环只与yield-return一起工作,并且在GetSequences方法中的GetSequences命令上没有yield-return;它返回的任何内容都不会被存储或返回。这就像你在做这件事: 就像你在做这个:
static IEnumerable<string> GetSequences(string a)
{
GetSequences(a + ">");
}
当然,我的整数是任意的,它适用于任何长度
编辑:我知道有一种方法可以做到这一点,就像阿巴蒂什切夫所说的那样,但我想不出来。在绞尽脑汁之后,我得到的是:
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;
}
这是您想要的输出,尽管我仍然认为对循环使用递归有点可笑。您只是返回传递的内容,这显然是一个包含yield return的函数可以是递归的:您已经在递归地调用它了。忽略它的结果这一事实并不会减少它的递归性。
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();
}
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;
}