为什么一个有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 + ",");
    }
}

我期待这样的输出

,>>,>>>

,但它没有。它只打印">,"。有没有人知道我错过了什么?

为什么一个有yield return的函数不能是递归的

使用相同的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;
    }

这是您想要的输出,尽管我仍然认为使用递归循环有点有趣。