2015-02-09 81 views
3

我無法弄清楚我的代碼中的錯誤。我知道有一個,但我不知道它是什麼。我是編碼新手,這只是我的第二個學期,我的教授讓我們跳到本書的最後來學習遞歸,但是在實驗中,本書指定作者希望我們實現其他技能,這些技能將在我們避難的章節中學習到還沒有完成。換句話說,我正在使用我還沒有真正學到的東西,所以我沒有看到這裏的錯誤。任何人都可以弄清楚我做錯了什麼,並解釋它我也會很樂意!謝謝!迴文測試:調試

if (palTest(s.toLowerCase().replaceAll("\\W",""))) 
     System.out.println("\nYour phrase is a palindrome!"); 

    public static boolean palTest(String str) 
    { 

     char first = str.charAt(0); 
     char last = str.charAt(str.length() - 1); 


     System.out.println(str); 
     System.out.println(first + " --- " + last); 
     System.out.println("----------------\n"); 


     if (str.length() <= 2) 
      return true; 
     else if (first != last) 
      return false; 
     else 
      return palTest(str.substring(1, str.length()-1)); 
    } 

if語句是我對palTest方法的調用。現在這個代碼幾乎適用於我輸入的所有短語。然而,當我進入這個短語: 「Dessertsm我強調」將信比較信最後,回到真正說,這句話是一個迴文。

我把一些System.out.println語句放在裏面,這樣我就可以看到到底發生了什麼,下面是打印出來的樣子。

Please enter a phrase you wish to test to discover if it it a palindrome: 
dessertsm i stressed 

dessertsmistressed 
d --- d 
---------------- 

essertsmistresse 
e --- e 
---------------- 

ssertsmistress 
s --- s 
---------------- 

sertsmistres 
s --- s 
---------------- 

ertsmistre 
e --- e 
---------------- 

rtsmistr 
r --- r 
---------------- 

tsmist 
t --- t 
---------------- 

smis 
s --- s 
---------------- 

mi 
m --- i 
---------------- 


Your phrase is a palindrome! 

可以用任何東西來代替它返回相同。請幫忙!謝謝!

回答

5

這是因爲如果長度爲2,則停止遞歸。等到它小於2停止。因此,改變這種:

if (str.length() <= 2) 
    return true; 

這樣:

if (str.length() < 2) 
    return true; 

的問題則是,它會崩潰,它在早期檢查,所以它移動到方法的開始。所以基本上,任何長度爲< 2的字符串都是平凡的迴文,並且不需要對它進行任何檢查;只是返回true。它只適用於比較第一個字符和最後一個字符所需的較長字符串。您的最終代碼應如下所示:

public static boolean palTest(String str) 
{ 
    if (str.length() < 2) return true; 

    char first = str.charAt(0); 
    char last = str.charAt(str.length() - 1); 

    if (first != last){ 
     return false; 
    } else{ 
     return palTest(str.substring(1, str.length()-1)); 
    } 
}