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 リターンでのみ機能し、GetSequences() メソッドの GetSequences() コマンドには yield リターンがありません。それが返すものは何でも保存されたり返されたりしません。あなたがこれをしているようなものです: あなたがこれをしているようなものです:

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 に答える