2012-04-12 33 views
1

Also muss ich das längste Wort rekursiv finden, ich habe den Code geschrieben, aber es funktioniert nicht, und ich habe keine Ahnung, was zu beheben ist.Finde längstes Wort in einem Satz rekursiv

 public static String longestWord(String sentence) 
{ 
    int i = sentence.indexOf(" "); 

    if (i==-1){ 
     return sentence; 
    } 

    else{ 
     String first = sentence.substring(0,i); 
     String rest = sentence.substring(i+1); 

      if(first.length()>=rest.length()){ 
       return longestWord(first); 
      } 
     else{ 
      return longestWord(rest); 

     } 

    } 
} 
+1

Dies ist keine Frage. Bitte finde Bits, über die du verwirrt bist, und formuliere sie als Fragen. Denken Sie daran, dass SO keine Seite ist, die Hausaufgaben für Sie löst. – SCdF

+1

Willkommen bei StackOverflow. Ist das eine Hausaufgabenfrage? Wenn ja, sollten Sie das Hausaufgaben-Tag hinzufügen. Haben Sie versucht, den Debugger zu verwenden, um durch den Code zu gehen, um zu sehen, was nicht wie erwartet funktioniert? Einen nicht funktionierenden Code zu posten und zu sagen: "Bitte korrigieren Sie, was auch immer falsch ist" ist keine geeignete Frage für diese Site. Bitte nehmen Sie sich ein paar Minuten Zeit, um die [FAQ] (http://stackoverflow.com/faq) zu lesen, um mehr darüber zu erfahren, wie Sie hier Fragen stellen können, und welche Fragen (und nicht) zu stellen sind Hier. Vielen Dank. :) –

+1

Muss es rekursiv sein? oder ist eine Schleife akzeptabel? – kasavbere

Antwort

2

Die Linie:

if(first.length() >= rest.length()) 

sollte lesen wie:

String res = longestWord(rest); 
if(first.length() >= res.length()) 
+0

Nicht unbedingt. Dies ist eine nützliche Optimierung. Wenn das erste Wort mindestens so lang ist wie der Rest der Zeichenfolge, kann der Rest der Zeichenfolge kein Wort enthalten, das länger ist. – Kaz

+0

Aber der Else-Pfad kann das längste Wort in der ursprünglichen Version verwerfen. –

+0

Es ist ein Korrektheitsproblem, kein Optimierungsproblem. – bdares

1

Der Grund ist es nicht der Fall funktioniert, dass Sie die Länge des longestWord(rest) ignorieren: Statt die Länge des Vergleichens des Anfangswortes und des Rests des Satzes sollten Sie die Länge des Anfangswortes mit der Länge des längsten Wortes vergleichen, das im Rest des Satzes gefunden wird.

1

Ihre grundlegende Vorgehensweise ist gesund: Sie brechen die Eingabe in zwei: das erste Wort und den Rest der Zeichenfolge. Aber dann ist die Logik ein wenig verpfuscht.

Ist das erste Wort ist mehr als der gesamte Rest des Strings, sollten Sie nur first zurückkehren, nicht longestWord(first) (obwohl, tun Sie diesen Fall behandeln. longestWord werden feststellen, dass das Wort nicht geteilt werden kann und es nur zurückkehren Es ist sinnlos aber).

Zweitens, wenn das nicht der Fall ist, können Sie nicht davon ausgehen, dass das erste Wort nicht das längste Wort ist. Sie müssen den Rückgabewert longestWord(rest) erfassen und dann die Länge dieses Wortes mit der Länge first vergleichen. Wenn dieses Wort länger ist, dann gib es zurück. Andernfalls geben Sie first zurück.

Die Essenz von "teile und herrsche" durch Rekursion ist, dass du einige kleinere Versionen des Problems löse und dann diese Ergebnisse integrierst. Vergiss diesen zweiten Teil nicht. Hierbei handelt es sich nicht um eine binäre Suchbaumsuche, bei der die Daten so organisiert sind, dass Sie nur auf die eine oder andere Hälfte des Speicherplatzes rekurrieren können, um die Antwort zu finden. Du weißt nicht, wo das längste Wort sein könnte.

1

Dies ist ein weiterer Ansatz, um die Frage zu lösen:

public static String longestWord(String sentence) { 
    return longest(sentence.split("\\s+"), 0, 0); 
} 

private static String longest(String[] words, int idx, int longest) { 
    if (idx == words.length) 
     return words[longest]; 
    return longest(words, idx+1, 
     words[idx].length() > words[longest].length() ? idx : longest); 
} 

Zuerst in longestWord() der Satz durch seine Räume aufgeteilt wird, produziert eine Reihe von Wörtern. Ab diesem Zeitpunkt iteriert die Methode rekursiv alle Wörter, die den Index des längsten bisher gefundenen Wortes im Parameter longest passieren, bis keine Wörter mehr vorhanden sind. Dies ist eine effiziente Antwort, da bei jedem Schritt keine Teilzeichenfolgen erstellt werden.

1
package com.kota.java; 
import java.util.*; 

class LongestWord{ 
    String str = "Ram is intelligent boy"; 
    String stringArray[] = str.split("\\s"); 

    public String compare(String st1, String st2) { 
     if (st1.length() > st2.length()) { 
      return st1; 
     } else { 
      return st2; 
     } 
    } 

    LongestWord() { 
     String word = ""; 
     for (int i = 0; i < stringArray.length; i++) { 
      if (i == 0) { 
       word = stringArray[0]; 
      } 
      word = compare(word, stringArray[i]); 
     } 
     System.out.println("Longest word = " + word); 
    } 

    public static void main(String[] args) { 
     new LongestWord(); 
    } 
} 
/** 
* Out put : Longest word = intelligent 
* 
* */ 
Verwandte Themen