Рекурсивная функция стиля Fib в Iterative? - PullRequest
1 голос
/ 04 октября 2011

У меня есть функция в Java, которая написана с помощью рекурсивного алгоритма, который должен быть написан в итерационной форме. Дело в том, что я не знаю, с чего начать обдумывать новый алгоритм для этого. Это задание, над которым я работаю.

Рассмотрим следующую вычислительную задачу:

Предположим, вы работаете в качестве консультанта, и у вас есть последовательность n потенциальных консультационных работ, которые платят соответственно A[0],A[1],..,A[n-1] долларов (таким образом, работа 0 оплачивается A[0] долларов, работа 1 оплачивается A[1] долларов и т. д.).

Кроме того, задание i начинается в день i (i = 0 ; : : : ; n 1 ).

Однако для каждого задания требуется 2 дня, поэтому вы не можете выполнять любые два последовательных задания. Цель состоит в том, чтобы определить максимальную сумму денег, обозначаемую F(n); Вы можете заработать на действительном расписании, выбранном из n рабочих мест A[0] до A[n-1] : В качестве примера рассмотрим следующий входной массив:

  0 1 2 3 4 5
A 5 6 8 6 2 4

Оптимальным графиком является выполнение заданий 0 ; 2 ; и 5; за что сумма денег заработано F(6) = A[0] + A [2] + A [5] = 17; настолько велика, насколько это возможно. Обратите внимание, что это является допустимым расписанием, так как не включены две последовательные работы.

Моя функция для рекурсивной версии, которая решает это следующим образом:

public static int jobScheduleRecursive(int[] A, int n) 
{
    n = A.length;
    if(n == 0){return 0;}
    else if(n == 1){return A[0];}
    else if(n >= 2){return max(jobScheduleRecursive(A, (n-1)), (A[n-1]) 
                           + jobScheduleRecursive(A, n-2));}
    else return -1;
}

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

1 Ответ

1 голос
/ 04 октября 2011

иногда итерационные решения для известного рекурсивного решения проблем не являются прямыми, как рекурсивное решение.Самый простой способ добиться итеративного решения - это использовать Динамическое программирование . В сущности, вам нужно создать временный массив, содержащий решение для всех подзадач.чтобы достичь этого, создайте динамически распределенный массив размером с ваш ввод.и если, например, ваша рекурсивная функция имеет тип int foo (int a), заполните массив решениями для 1..n, где n - вход для вашей исходной задачи.измените алгоритм, чтобы вместо рекурсивного вызова он проверил, существует ли уже решение для подзадачи в массиве, если нет, то заполняет его.таким образом, подзадача не будет вычислять числовое время, а только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...