2013-04-28 76 views
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 + ","); 
    } 
} 

一段代碼我期待的輸出這樣

,>>,>>>

但它沒有。它只打印「>,」。有誰知道我錯過了什麼?

+0

你只是返回什麼是通過它是「>」 – 2013-04-28 05:09:59

+3

顯然,一個帶有yield return的函數可以是遞歸的:你已經遞歸地調用它了。事實上,你忽略它的結果並不會減少遞歸。 – hvd 2013-04-28 07:44:15

回答

3

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

這有你想要的輸出,但我仍然認爲使用遞歸循環使用是有點好笑。

7

使用相同的foreach函數本身:

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

,不要忘記退出遞歸。

相關問題