2013-04-05 4 views
0
public static int getIndexOf(char ch, String str) { 
    if (str == null || str.equals("")) { 
     return 0; 
    //base case 
    }else{ 
     char first = str.charAt(0); 
     if (ch != first) { 
      return -1; 
    //returns -1 when the character cannot be found within the string 
     }else{ 
      int rest = str.length() - 1; 
      if (str.charAt(rest) == ch) { 
       return rest; 
      } 
      return lastIndexOf(ch, str.substring(0, rest)); 
      //recursive case 
     } 
    } 
} 

Этот мой метод возвращает индекс входного символа входной строки. Однако, когда я запускаю его в плоскости взаимодействия, он возвращает неправильное число. Например, когда я вхожу в «a» и «персик», он должен возвращать 2, но он возвращает -1. Этот метод должен возвращать -1 только тогда, когда символ не может быть найден в строке. Может ли кто-нибудь сказать мне, как с этим бороться? Спасибо!Неправильный вывод рекурсивного метода

+0

Прежде всего, почему вы не используете string.indexOf (char); ?? – jsedano

+0

Если вам нужен индекс 'a' в' персике', вы перейдете в блок 'else' (потому что' персик' не 'null' и не равен' '' '). Там первый символ ('p') сравнивается с' a', которые не равны. Поэтому условие 'if' является' true', и ваш метод вернет '-1'. – jlordo

+0

Во-вторых, вы получаете -1 вместо двух ... вы выполняете этот метод, и если возвращается -1, когда ch! = First – jsedano

ответ

1

Хорошо, почему бы вам не пройти через логику и не увидеть, что происходит.

getIndexOf('a', "peach") 

Метод входит, строка не пустая или пустая, поэтому она попадает на следующую строку кода.

char first = str.charAt(0); // this is 'p' 

if (ch != first) { // is 'p' equal to 'a'? no. so return -1 
     return -1; 

И тогда остальная часть вашей логики никогда не будет выполнена. Вы можете понять, как исправить эту проблему?

+0

Спасибо. Я слишком глуп, чтобы понять эту проблему ... – user2242438

0

Ваша следующая часть кода означает, что она проверит наличие первого символа строки, если она соответствует, иначе она вернет -1.

char first = str.charAt(0); 
     if (ch != first) { 
      return -1; 

это говорит о том, что если символ в 0-й индекс не соответствует затем отправить -1 так как «р» в «персик» не сопрягая с «а» так оно возвращает -1.

Вы поняли это?

+0

Да, но как мне с этим справиться? – user2242438

0

Выход не ошибается, реализация выполнена!

Сначала подумайте над словами. Если нужный символ является первым символом в строке, то результат равен нулю. В противном случае это (1 + индекс в строке, которая остается после отрезания первого символа). Теперь скопируйте слова:

return (str.charAt(0) == ch) ? 0 : 1 + getIndexOf(ch, str.substring(1)); 

Это еще не относится к случаю, когда символ отсутствует в строке. Здесь звонок charAt(0) в конечном итоге бросит IndexOutOfBoundsException, потому что у str его нет!

Самый чистый способ справиться с этим случаем - это исключение. Таким образом, у вас есть две функции: mustGetIndexOf, которая является рекурсивным отношением выше, и getIndexOf, которая вызывает одно из них внутри try {} catch() {}, возвращая -1 в этом случае.

Конечно, если вы не хотите разрешать исключение, вы можете проверить результат рекурсивного вызова с помощью if для специального случая -1. Код более уродливый, но он будет работать. Всякий раз, когда видна стрелка -1, снова возвращайте -1. Это распространяется на -1 на обратном пути к вызывающему абоненту. Исключение «разматывает» рекурсивные вызовы в стеке аналогичным образом, только с одним измельчением, а не поэтапным позором, как это делают ваши if заявления.

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

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