2016-05-16 1 views
0

В настоящее время я изучаю Java, и я наткнулся на упражнение, которое я не могу закончить.Рекурсивная разность Java в массиве

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

Например, {12, 5, 3, 8} должен вернуть 5 (8 - 3). Важно отметить, что разрешено сравнивать значения в правильном порядке (result = rightValue - leftValue). Например, 12-3 = 9 не будет разрешено. Подумайте об этом, как о стоимости акций. Вы хотите узнать, какое время покупать и продавать акции, чтобы получить наибольшую прибыль.

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

+4

показать нам, что вы пробовали до сих пор – attaboy182

+0

@ Turing85 Нет, вам разрешено сравнивать ценности в своем произвольном порядке. Подумайте об этом, как о стоимости акций. Вы хотите узнать, какое время покупать и продавать акции, чтобы получить наибольшую прибыль. –

+0

Есть слишком много возможных ответов, или хорошие ответы будут слишком длинными для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или изолировать проблему, на которую можно ответить в нескольких абзацах. + Ваш пример для меня не имеет смысла. –

ответ

0

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

/* крайние случаи игнорируются здесь */

int findMax(int[] arr, int left, int right){ 

if(right-left == 1) return (arr[right]-arr[left]); 

int middle = left + (right-left)/2; 

int max1 = findMax(arr, left, middle); 
int max2 = findMax(arr, middle, right); 

if(max1 >= 0 && max2 >= 0) return max1+max2; 

else return Math.max(max1,max2); 

} 
+0

Это решило мой вопрос, большое спасибо! –

+0

Не могли бы вы объяснить, почему середина должна быть 'left + (right-left)/2'? Я ожидал, что это будет только «(справа налево)/2'. –

-3

Алгоритм (это в значительной степени задача сортировки, то шаг вычитания тривиально)

1) Сначала сортировать массивы (использовать рекурсивную сортировку слияния для больших массивов и рекурсивных вставок для небольших массивов).

сортировка слиянием (https://en.wikipedia.org/wiki/Merge_sort)

Вставка рода (https://en.wikipedia.org/wiki/Insertion_sort)

2) Используйте массивы наименьший индекс [0], чтобы получить наименьшее значение & индекс [array.length-1], чтобы получить наибольший

3) вычислить разницу (не знаю, что вы имеете в виду правильном порядке?)

+0

Это приведет к 12 - 3 = 9, что, очевидно, говорит OP, это не ответ. – mks

+0

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

+0

Должен признать, что я не очень хорошо объяснил, в чем моя проблема. Эта задача предназначена для имитации фондового рынка. Вы пытаетесь максимизировать свою прибыль, покупая с наименьшим значением и продавая на самом высоком уровне. –

0

Ну я не думаю, что рекурсия является очень эффективным в этом. Вы, вероятно, никогда не сделаете этого (кроме домашней работы). Что-то, как это будет делать:

int findGreatestDifference(Vector<Integer> numbers, int greaterDifference){ 
    if(numbers.size() == 1) //return at last element 
     return greaterDifference; 
    int newDifference = (numbers.get(0) - numbers.get(1)); 
    if (newDifference > greaterDifference) 
     greaterDifference = newDifference; 

    numbers.remove(numbers.size() - 1); 
    findGreatestDifference(numbers, greaterDifference); 
    return greaterDifference; 
} 

первый раз, когда вы называете, передайте 0 как большая разность, и снова я не нахожу это как эффективный способ сделать это. Итерация была бы лучше для этого.

Надеюсь, это поможет.

+0

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

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

  • Нет связанных вопросов^_^