2013-07-12 89 views
1

我試圖寫一個函數來檢查一個字符串是否是迴文,並使用this example,我試圖使用遞歸匿名函數來扭轉字符串:StackOverflowException遞歸匿名函數

static Boolean checkPalindromeAnonRec(string str) 
{ 
    str = str.ToLower().Replace(" ", String.Empty); 
    Func<string, string> revStr = null; 
    revStr = delegate(string s) 
     { 
     if (s.Length > 1) 
      { return revStr(s) + s[0]; } 
     else 
     { return s; } 
     }; 

    return (str == revStr(str)); 
} 

但每次運行時,我都會得到StackOverflowException。這對我而言並不明顯,爲什麼,有什麼想法?

回答

5

嗯,這就是問題所在:

if (s.Length > 1) 
    { return revStr(s) + s[0]; } 
從奇支撐風格

除此之外,這只是遞歸與原始字符串 - 因此它會繼續下去,直到永遠。我懷疑你的意思,使其遞歸使用較短的字符串使用Substring某處...

我真的試着寫它作爲一個簡單的非匿名(但仍遞歸)方法入手 - 所以制定出你會怎麼寫遞歸:

static string Reverse(string input) 

...然後如果你仍然想內聯到你CheckPalindrome方法,你可以這樣做。

+0

多麼尷尬。一直應該是'return revStr(s.Substring(1))+ s [0]'。 – Jellezilla

+0

只是試了一下。與匿名函數 – Jellezilla

+0

+1相比,它對命名函數的實際執行效果更好。當你完成修復代碼時,要正確地匿名遞歸:[C#中的匿名遞歸](http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c .aspx) –