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;
}
これで目的の出力が得られますが、ループで再帰を使用するのは少しおかしいと思います。