foreach循環僅適用於yield return,並且GetSequences()方法中的GetSequences()命令沒有收益率回報;無論它返回什麼都不會被存儲或返回。它就像你正在做的: 這就像你正在做的:
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-28 05:09:59
顯然,一個帶有yield return的函數可以是遞歸的:你已經遞歸地調用它了。事實上,你忽略它的結果並不會減少遞歸。 – hvd 2013-04-28 07:44:15