0

我有一段这样的代码

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 + ",");
    }
}

我期待这样的输出

,>>,>>>

但事实并非如此。它只打印“>”。有谁知道我错过了什么?

4

2 回答 2

7

在函数本身中使用相同的 foreach:

static IEnumerable<string> GetSequences(string a)
{
    yield return a;
    foreach (var n in GetSequences(a + ">"))
        yield return n;
}

并且不要忘记退出递归。

于 2013-04-28T05:09:33.997 回答
3

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

这有你想要的输出,虽然我仍然认为使用循环递归有点有趣。

于 2013-04-28T07:24:41.460 回答