Вычисление min
по результату выполнения findShortestString
не имеет смысла.Лучший способ начать такую проблему - рассмотреть только один рекурсивный шаг, вы можете сделать это, учитывая, что происходит с массивом, состоящим только из двух строк, для сравнения.
Что вы хотите сделать, это проверитьдлина первой строки в зависимости от длины второй.Реальный трюк, однако, заключается в том, что вы хотите проверить длину секунды, вызывая функцию рекурсивно.Это достаточно просто, но требует определения конца вашей рекурсии.Вы сделали это успешно, это когда lo == hi
.То есть, когда lo == hi
самая короткая из известных строк, это lo
(это единственная известная строка!).
Хорошо, так что вернемся к сравнению только двух строк.Учитывая, что вы знаете, что хотите сравнить длину двух строк, хранящихся в paths
, вы можете сделать что-то вроде этого (без рекурсии):
if(safeStringLength(paths[0]) < safeStringLength(paths[1])){
return 0; // paths[0] is shorter
}else{
return 1; // paths[1] is shorter
}
Но вы хотите повторить - и вшаг recurse вам нужно как-то сгенерировать это 1
из paths[1]
.Мы уже выяснили, как это сделать, когда lo == hi
, мы возвращаем lo
.Таким образом, шаг рекурсии «сравнить текущую самую низкую известную длину строки с длиной строки самого известного индекса» - подождите, у нас есть функция для этого!это findShortestString
.Таким образом, мы можем изменить то, что написано выше, чтобы быть немного более кратким, и добавить в базовый вариант, чтобы получить:
static int findShortestString(String[] paths, int lo, int hi) {
// base case, no comparisons, the only known string is the shortest one
if(lo == hi){
return lo;
}
int bestIndex = findShortestString(paths, lo+1, hi);
return safeStringLength(paths[lo]) < safeStringLength(paths[bestIndex]) ?
lo : bestIndex;
}