Нахождение минимума массива с помощью рекурсии? - PullRequest
6 голосов
/ 09 апреля 2011

Хорошо, поэтому я пытался обернуть голову вокруг рекурсии в Java, и я могу выполнять простые задачи, такие как сумма, обращение и т. Д., Но я изо всех сил пытался выполнить это упражнение:

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

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

Это то, что я имею до сих пор:

public static double findMin(double[] numbers, int startIndex, int endIndex) {

double min;
int currentIndex = startIndex++;

if (startIndex == endIndex)
    return numbers[startIndex];

else {
    min = numbers[startIndex];
    if (min > numbers[currentIndex]) {
        min = numbers[currentIndex];
        findMin(numbers, currentIndex, endIndex);
    }
            return min;
}       
} //findMin

Ответы [ 4 ]

5 голосов
/ 09 апреля 2011

Вот упрощенная версия:

public static double min(double[] elements, int index) {

  if (index == elements.length - 1) {
    return elements[index];
  }

  double val = min(elements, index + 1);

  if (elements[index] < val)
    return elements[index];
  else
    return val;
}
5 голосов
/ 09 апреля 2011

Подсказка: вы вызываете findMin рекурсивно, но затем не используете его возвращаемое значение.

Какова связь между (1) минимумом всего массива, (2) первым элементом и(3) мин всего, кроме первого элемента?

4 голосов
/ 09 апреля 2011

В этом коде множество проблем, в том числе:

  • Вы не используете результат рекурсивного вызова findMin.
  • startIndex будет одинаковым для каждого вызова findMin, поскольку currentIndex устанавливается на значение startIndex до увеличения startIndex.
  • Если число в индексе 1 в массиве равно <= число в индексе 0, вы просто возвращаете это число, даже не делая рекурсивный вызов. </li>
1 голос
/ 09 апреля 2011

Несколько замечаний в дополнение к первому ответу:

  • int currentIndex = startIndex++; - вы пропустите свой первый элемент здесь.В общем, вы не хотите изменять входные данные для вашей рекурсивной функции.Отработайте ввод и сгенерируйте новые значения, когда будете готовы снова вызвать функцию - например, 'findMin (numbers, currentIndex + 1, endIndex)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...