Я видел вопрос, и мне интересно, возможно ли решить его с помощью рекурсии. Это выглядит следующим образом:
Напишите алгоритм, который при задании массива входных данных находит максимальное произведение из этих входных данных. Например:
Input: [1, 2, 3]
Output: 6 (1*2*3)
Input: [-1, 1, 2, 3]
Output: 6 (1*2*3)
Input: [-2, -1, 1, 2, 3]
Output: 12 (-2*-1*1*2*3)
Я пытаюсь найти способ использовать рекурсию для ее решения, но алгоритм, который я пробовал, не работает. Мой алгоритм, написанный на Java, выглядит следующим образом:
Integer[] array;
public int maximumProduct(int[] nums) {
array=new Integer[nums.length];
return multiply(nums, 0);
}
public int multiply(int[] nums, int i){
if (array[i]!=null){
return array[i];
}
if (i==(nums.length-1)){
return nums[i];
}
int returnval=Math.max(nums[i]*multiply(nums, i+1), multiply(nums, i+1));
array[i]=returnval;
return returnval;
}
Проблема этого алгоритма в том, что он не работает хорошо, если есть четное число отрицательных чисел. Например, если nums [0] = - 2, nums [1] = - 1 и nums [2] = 1, то умножение (nums, 1) всегда будет возвращать 1 вместо -1, и, таким образом, оно всегда будет видеть 1 больше чем 1 * -2 при умножении (числа 0). Однако я не уверен, как решить эту проблему. Есть ли способ решить эту проблему с помощью рекурсии или динамического программирования c?