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