数组中的Java递归差分

数组中的Java递归差分,java,arrays,recursion,iteration,divide-and-conquer,Java,Arrays,Recursion,Iteration,Divide And Conquer,我目前正在学习Java,偶然发现了一个无法完成的练习 任务是编写一个递归方法,该方法接受一个数组并返回最大值和最小值之差 例如,{12,5,3,8}应该返回5(8-3)。需要注意的是,只允许按正确的顺序比较值(result=rightValue-leftValue)。例如,不允许使用12-3=9。把它想象成股票价值。你想知道什么时候买进和卖出股票才能获得最大的利润 实现这个迭代非常简单,但我不知道如何递归实现它。此外,使用分治算法解决它也是任务的一部分。算法(这几乎是一项排序任务,因此减法步骤很

我目前正在学习Java,偶然发现了一个无法完成的练习

任务是编写一个递归方法,该方法接受一个数组并返回最大值和最小值之差

例如,
{12,5,3,8}
应该返回
5
8-3
)。需要注意的是,只允许按正确的顺序比较值(
result=rightValue-leftValue
)。例如,不允许使用
12-3=9
。把它想象成股票价值。你想知道什么时候买进和卖出股票才能获得最大的利润

实现这个迭代非常简单,但我不知道如何递归实现它。此外,使用分治算法解决它也是任务的一部分。

算法(这几乎是一项排序任务,因此减法步骤很简单)

1) 首先对数组进行排序(对大数组使用递归合并排序,对小数组使用递归插入排序)

合并排序()

插入排序()

2) 使用数组最小索引[0]获取最小值,使用索引[array.length-1]获取最大值


3) 计算差异(不知道正确的顺序是什么意思?

我在这里使用了分而治之的方法。我相信这里的诀窍是在我们将主数组拆分成的两个数组中都包含中间数组

/*此处忽略边缘情况*/

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);

}

我认为递归在这方面不是很有效。你可能永远不会做这件事(除了家庭作业)。像这样的东西可以做到:

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;
}
int findCreateStDifference(向量数,int greaterDifference){
if(numbers.size()==1)//返回最后一个元素
回报差异较大;
int newDifference=(numbers.get(0)-numbers.get(1));
如果(新差异>更大差异)
更大的差异=新的差异;
numbers.remove(numbers.size()-1);
查找最大差异(数字,最大差异);
回报差异较大;
}
第一次调用时,将0作为更大的差异传递,我再次发现这不是一种有效的方法。迭代会更好


我希望这能有所帮助。

让我们看看你是如何尝试的far@Turing85不,只允许按正确顺序比较值。把它想象成股票价值。你想知道在什么时候买入和卖出股票以获得最大利润。可能的答案太多,或者好的答案对于这种格式来说太长。请添加详细信息,以缩小答案集或隔离可以在几个段落中回答的问题你的例子对我来说没有意义。@YassinHajaj我想把数组分成两半,然后比较后面的值,但我真的不知道要返回什么值。@Nbert你必须检查某些值的组合(倒数第二、倒数第三、倒数第二、倒数第三、倒数第三、倒数第三、倒数第三、倒数第三、倒数第二)。这可以递归完成。您可以返回以这种方式找到的最大值或自编类的某个对象,其中包含所有必要的信息。这当然只是许多可能的解决方案之一,但可能会让您开始。这将导致12-3=9,OP明确指出这不是答案。如果您对数组进行排序,则不会我不得不担心顺序。我被特别要求实现一个分而治之的算法。我不得不承认,我没有很好地解释我的问题是什么。这个任务是为了模拟股票市场。你试图通过以最低的价格买入,以最高的价格卖出来实现利润最大化。如果你试图模拟一个stock市场,那么你的方法可能是最差的方法,因为股票数据是流式时间序列。确定价格是最低还是最高将基于历史建模,分析窗口也很重要。最近1秒、1分钟、1天、1周的最低或最高价格,其相对值。我进一步基于我的解释关于你承认的问题,递归的措辞不好。我知道递归在这个练习中很愚蠢,但其中一部分是迭代的,另一部分是递归的。谢谢你的帮助!这解决了我的问题,非常感谢!你能解释为什么中间必须是
left+(右-左)吗/2
?我希望它只是
(左/右)/2