2016-04-22 20 views
1

Ich schrieb Palindrome-Funktion in Java mit Rekursion, aber seine Ergebnisse nicht korrekt gedruckt.Was ist falsch mit dieser Palindrome-Funktion

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")); 

    } 

Ausgang:

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

Sie haben 'return' in' if' vergessen: 'return isPalidrome (...)'. –

+0

Warum haben Sie Rekursion verwendet? – Bathsheba

Antwort

2

Sie vermissen die return Anweisung innerhalb der if. Ohne sie alles andere als eine Folge von einer oder Null-Zeichen wird letztlich false zurück:

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

Auch Ihr char Vergleich ist Groß-und Kleinschreibung, die noch dazu führen würde "Rotor" zu scheitern. – Zircon

+0

@Zircon während OPs Ausgabe über 'Rotor' ist, überprüft sein' Haupt' tatsächlich die Zeichenkette 'Rotor'. Obwohl ich zustimme, wenn wir nach einem "case insensitive palindrome" suchen wollen, sollten Sie 'Character # equalsIgnoreCase' anstatt eines einfachen' == 'für primitive' char's verwenden. Oder, alternativ Kleinbuchstaben (oder Großbuchstaben) beide Zeichen. – Mureinik

1

Ihre Probleme im Wesentlichen aus einer Technik, schlechte Lösung einzudämmen. Rekursion ist ein suboptimaler Weg, dies zu lösen - denken Sie an all die Stack-Frames, die die JVM erstellen muss! Wenn Sie in der Lage sind, den Ansatz zu Graben, und bereit sind, für Prägnanz zu opfern Leistung, dann

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

zu verwenden, die offensichtlich wesentlich einfacher zu warten ist (obwohl dies zwei zusätzliche Objekte erstellen wird und ausführen doppelt so viele Charaktervergleiche, wie es unbedingt notwendig ist). Verwenden Sie equals, wenn Sie den Fall als wichtig für Palindromizität betrachten.

1

Sie müssen Rückkehr hinzufügen hier:

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; 

Wenn Sie dies nicht tun, es wird auch weiterhin nur ausgeführt werden, nachdem Sie das letzte Mal anruf Prüfung (in Ihrem Fall für Zeichenfolge „t“), und es wird end mit return false.

Verwandte Themen