2016-03-20 16 views
-1

meine aktuellen Code den Ausgang zurück:Rekursion zu prüfen, ob ein String eine andere Zeichenfolge entspricht

true 
Expected: true 

false 
Expected: true 

false 
Expected: true 

false 
Expected: false 

false 
Expected: false 

Also gibt es ein Problem mit meiner Logik, die ich nicht

public static void main(String[] args) 
{ 

    System.out.println(find("","")); 
    System.out.println("Expected: true\n"); 

    System.out.println(find("Mitten","Mit")); 
    System.out.println("Expected: true\n"); 
    System.out.println(find("I love my CS courses!"," CS")); 
    System.out.println("Expected: true\n"); 
    System.out.println(find("","Cookies.")); 
    System.out.println("Expected: false\n"); 
    System.out.println(find("Java","Python")); 
    System.out.println("Expected: false\n"); 


} 
public static boolean find(String text, String str) 
{ 

    boolean found = false; 
    if(text.length() == 0 && str.length() == 0) 
    { 
     found = true; 
     return found; 
    } 
    if(text.length() == 0 || str.length() == 0) 
    { 
     return found; 
    } 
    if(str.length() > text.length()) 
    { 
     return found; 
    } 
    if(str.equals(text.substring(0,str.length()-1))) 
    { 
     found = true; 
    } 
    else 
    { 
     text = text.substring(1); 
     find(text, str); 
    } 
    return found; 
} 

bitte helfen

bin zu sehen
+0

Sie definieren 'gefunden' bei jedem Rekursionsaufruf. – Maroun

+1

Ihr Titel sagt * "wenn eine Zeichenkette ** einer anderen Zeichenkette" * entspricht, aber Ihr Code sagt, dass Sie 'true' erwarten, wenn Sie' Mitten' und 'Mit' vergleichen, und sie sind definitiv ** nicht ** gleich. Also, was willst du wirklich von der Methode? – Andreas

+0

Sie sollten die gefundene Variable loswerden. Geben Sie einfach 'true' oder' false' direkt zurück, oder den Wert aus dem rekursiven Aufruf, den Sie im Moment ** nicht ** gerade machen. – Andreas

Antwort

7

Ich sehe ein Problem mit dieser Aussage

if(str.equals(text.substring(0,str.length()-1))) 

Da der zweite Index der substring exklusiv ist, sollte es

if(str.equals(text.substring(0,str.length()))) 

um str auf die ersten Zeichen von str.lengthtext zu vergleichen sein.

Natürlich können Sie text.contains(str) oder text.startsWith(str) verwenden und etwas von Ihrem Code entfernen, aber das ist vielleicht nicht Teil der Übungsanforderungen.

Neben diesem Problem, wenn Sie einen rekursiven Aufruf zu machen, sollen Sie in der Regel etwas mit dem von diesem Aufruf zurückgegebene Wert tun:

found = find(text, str); 

sonst, warum in erster Linie den rekursiven Aufruf machen? (es sei denn, es hat Nebenwirkungen, die als Parameter an den rekursiven Aufruf übergebenen Objekte zu mutieren.)

+0

Danke! das korrigierte die Ausgabe für den 3. Test, aber ich werde immer noch falsch, wenn es für den 4. Test wahr erwartet wird. Irgendeine Idee warum? – user3185727

+1

@ user3185727 ein weiterer Fehler ist, dass Sie nicht den Rückgabewert Ihres rekursiven Aufrufs zuweisen, sollte es gefunden werden = finden (Text, str); – radoh

+0

@radoh guten Punkt – Eran

Verwandte Themen