2013-02-11 2 views
0

Прежде всего я должен сказать, что это назначение, что сбивает с толку меня, я уже исправил один из вопросов по лектора:/Java рекурсивный метод для подсчета слов

Во всяком случае, я сделал метод который подсчитывает слова с использованием булевых элементов, цикла while и счетчика.

Однако мне нужно каким-то образом определить форму в рекурсивном методе, который подсчитывает количество слов в строке, слово ограничено одним или несколькими пробелами.

countWords(" hello this is an example", 0); // returns 5

Как вы можете видеть только параметры countWords (String s, Int я), что делает его более трудным.

Кроме того, в рамках метода я ограничусь только использованием этих трех методов: s.charAt (0), s.substring (1) и s.equals (""), что делает его скорее головоломкой :)

Это ни рекурсивный метод, который я написал, используя время цикла:

public static int countWords(String s) { 
    int words = 0; 
    boolean spaceBefore = true; 
    boolean spaceCurrently = false; 
    while(true) { 
     if (s.equals("")) 
      return words; 

     if (s.charAt(0) == ' ') 
      spaceCurrently = true; 
     else 
      spaceCurrently = false; 

     if (spaceBefore && !spaceCurrently) 
      words++;   

     spaceBefore = spaceCurrently; 
     s = s.substring(1); 
    } 
} 
+2

Опубликовать свой первый метод. И какой бы код вы ни попробовали для вашего рекурсивного. –

+0

Подсказки: количество слов = количество пробелов +1. Количество слов = 1 + количество слов в строке после первого пробела. – MrSmith42

+0

@ MrSmith42 'слово ограничено одним или ** многими ** пробелами – fvu

ответ

2

Ну, так как это домашнее задание, я воздержусь от предоставления вам кода. Но я объясню вам это решение. Посмотрите, можете ли вы перестроить код из него.

В методе сначала удалите пробелы с начала и конца строки, так как мы хотим игнорировать его. Используйте метод trim(). Затем проверьте, является ли строка пустой строкой (""), как в коде. Если это так, то возвращает ноль, потому что пустая строка не содержит слов, в противном случае в бесконечном цикле (while (true)) проверьте следующие условия:

  • Создать переменную для хранения текущего индекса, один из которых не является локальным для цикл, но он локален для метода. Для каждой итерации бесконечного цикла проверьте, не является ли текущий символ (с использованием метода charAt()) пробелом и что индекс меньше длины строки. Если это условие истинно, увеличьте индексную переменную.
  • Если нет, проверьте, равна ли указательная переменная длине строки. Если да, то верните 1, потому что это означает, что мы достигли последнего слова строки.
  • Если нет, верните сумму 1 и метод для подсчета слов, рекурсивно вызываемых для подстроки из текущего значения индекса.

Это должно дать вам значение. Если вы все еще не можете этого сделать, сообщите мне, и я дам вам источник.

EDIT Ну, если вы не можете использовать метод обрезки String, вы можете написать для себя вот так. Я считаю, что это не нарушает какие-либо из ваших требований:

private String trim(String str) { 
    int beginIndex = 0; 
    int endIndex = str.length() - 1; 

    while (true) { 
     if (str.charAt(beginIndex) == ' ') { 
      beginIndex++; 
     } else if (str.charAt(endIndex) == ' ') { 
      endIndex--; 
     } else { 
      break; 
     } 
    } 

    return str.substring(beginIndex, endIndex); 
} 

Edit 2 Если вы не можете использовать length() либо, а затем изменить эту строку кода int endIndex = str.length() - 1;' to INT ENDINDEX = GetLength (НТР) - 1; `и использование следующий код для вычисления длины.

private int getLength(String str) { 
    int length = 0; 

    while (true) { 
     try { 
      str.charAt(length++); 
     } catch (StringIndexOutOfBoundsException e) { 
      break; 
     } 
    } 
    return --length; 
} 

Редактировать 3 Поскольку вопрос такой PITA, было бы трудно объяснить словами. Итак, вот код:

private int countWords(String searchString) { 
    int index = 0; 
    boolean beginning = true;  // to check if it's the beginning of the line 

    if (searchString.equals("")) { 
     return 0; 
    } else { 
     while (true) { 
      try { 
       if (searchString.charAt(index) != ' ') { 
        beginning = false; 
        index++; 
       } else { 
        if (!beginning) { 
         return 1 + countWords(searchString.substring(++index)); 
        } else { 
         return countWords(searchString.substring(++index)); 
        } 
       } 
      } catch (StringIndexOutOfBoundsException e) { 
       if (!beginning) { 
        return 1; 
       } else { 
        return 0; 
       } 
      } 
     } 
    } 
} 

Это поможет вам достичь того, чего вы хотите, только с помощью тех методов, которые вам разрешено использовать.

+0

Я не могу использовать метод trim(). – Ciphor

+0

Вы можете использовать приведенный выше код, если не хотите использовать 'trim()' String'. – aa8y

+0

Я не могу использовать .length() либо lol, я специально сказал, что могу использовать только три метода, изложенные в моем вопросе? – Ciphor

0

Я не буду размещать код непосредственно, поскольку это ваше задание, но вот некоторые направления.

Число слов в строке - это текущее слово + количество слов в остальной части строки. Поскольку вы ограничены обработки одного гольца в то время, вы можете думать об этом так:

  • есть параметр, который говорит вам, если вы находитесь в слове
  • если s.charAt (0) является пространство, и вы в словах, то вы увеличите счетчик и установите inWord на false
  • если s.charAt (0) - это буква, и вы ни слова ни слова, вы устанавливаете inWord на true
  • recurse with updated счетчик и s.subString (1) и обновлены inWord

и вы начинаете все с 0, s, false

Представьте себе преобразование цикла в рекурсию, перемещая переменные извне цикла в параметры метода.

Я надеюсь, что это не было слишком запутанным.

+0

Я не могу иметь boolean как параметр. – Ciphor

+0

вам нужно держать свое состояние где-нибудь, если вы можете перемещать только одного персонажа за раз. Если вы можете утверждать, что между словами, которые вам не нужны, будет только одно пространство. – edofic

+0

В этом проблема, если я попытаюсь создать логическое значение в методе, он всегда будет возвращен к тому, что я изначально установил, мне нужен способ работы с сбросом. – Ciphor

0

Учитывая, что это домашнее задание, я не дам вам ответа сразу.

Рекурсия, если механизм, в котором метод вызывает себя. Очевидно, что если метод делает это неопределенно, вы, в конце концов, получите исключение stackoverflow, поэтому вам нужно какое-то условие выхода, когда метод перестает называть себя.

Вот пример - представьте, что вы хотели написать метод умножения, который принимает два числа и умножает их, но у вас есть только сложение и вычитание в вашем распоряжении.

public int multiply(int value1, int value2) 
{ 
    if (value1 > 1) 
    { 
    int remaining = value1 - 1; 
    return value2 + multiply(remaining, value2); 
    } 
    else 
    { 
    return value2; 
    } 
} 

Здесь метод называет себя, пока он не добавил value2 себе value1 раз в этот момент он возвращается в стек.

Вы можете сделать что-то похожее на ваш подсчет слов - продолжать вызов метода, передающего подстроку, взятую из первого пространства в конец строки, до тех пор, пока в строке не будет больше пробелов, в которые точка возвращает стек ,

Смежные вопросы