2016-04-22 78 views
1

我用Java編寫了迴文功能,但是它的打印結果不正確。這個迴文功能有什麼問題

public static boolean isPalindrome(String test) { 
     if(test.length() == 1 || test.equals("")) { 
      System.out.println("Length is one"); 
      return true; 

     } 

     if (test.charAt(0) == test.charAt(test.length() - 1)) { 
      System.out.println("Length is one 111 a"); 
      isPalindrome(test.substring(1,test.length() -1)) ;  
     } 
     System.out.println("Length is one 111"); 
     return false; 
    } 

    public static void main(String args[]) { 
     if(isPalindrome("rotor")) 
      System.out.println(" Rotor is a palindrome"); 
     else 
      System.out.println(" Rotor is not a palindrome"); 
     //System.out.println(isPalindrome("rotor")); 
     //System.out.println(isPalindrome("motor")); 
     //System.out.println(isPalindrome("a")); 

    } 

輸出:

Length is one 111 a 
Length is one 111 a 
Length is one 
Length is one 111 
Length is one 111 
Rotor is not a palindrome 
+2

您忘記了'if'返回':'return isPalidrome(...)'。 –

+0

你爲什麼使用遞歸? – Bathsheba

回答

2

你缺少ifreturn聲明。沒有它,什麼,但一個或零字符的字符串將最終迴歸false

public static boolean isPalindrome(String test) { 
    if(test.length() <= 1) { // A more elegant check 
     return true; 
    } 

    if (test.charAt(0) == test.charAt(test.length() - 1)) { 
     // "return" was missing here 
     return isPalindrome(test.substring(1, test.length() -1)) ;  
    } 
    return false; 
} 
+1

此外,你的字符比較區分大小寫,這仍然會導致'Rotor'失敗。 – Zircon

+0

@鋯石,而OP的輸出是關於'轉子',他的'主'實際上檢查串'轉子'。雖然我同意,但如果我們要檢查「不區分大小寫的迴文」,則應該使用Character#equalsIgnoreCase而不是原始'char'的簡單'=='。或者,也可以是小寫(或大寫)兩個字符。 – Mureinik

1

你的問題基本上是從一個貧窮的解決方案技術幹。遞歸是解決這個問題的次優方式 - 考慮JVM必須創建的所有堆棧框架!如果你能溝的辦法,並願意犧牲簡潔的表現,然後用

return test.equalsNoCase(new StringBuilder(test).reverse().toString());

這顯然是相當容易維護(雖然這將創建兩個額外的對象執行兩倍許多字符比較是必要的)。如果您認爲案例對於迴文是重要的,請使用equals

1

必須在此處添加回報:

if (test.charAt(0) == test.charAt(test.length() - 1)) { 
      System.out.println("Length is one 111 a"); 
      return isPalindrome(test.substring(1,test.length() -1)) ; 
     } 
     System.out.println("Length is one 111"); 
     return false; 

如果你不這樣做,它只會繼續測試完最後一次通話(你的情況爲串「T」)後執行,它會結束返回false。