【问题标题】:Java recursive difference in array [closed]数组中的Java递归差异[关闭]
【发布时间】:2016-09-12 15:43:59
【问题描述】:

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

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

例如{12, 5, 3, 8} 应该返回5 (8 - 3)。请务必注意,仅允许按正确顺序比较值 (result = rightValue - leftValue)。例如,12-3 = 9 是不允许的。把它想象成股票价值。你想知道什么时候买卖股票可以获得最大的利润。

实现这个迭代很容易,但我不知道如何递归。使用分而治之的方法来解决它也是任务的一部分。

【问题讨论】:

  • 向我们展示您迄今为止的尝试
  • @Turing85 不,它只允许以正确的顺序比较值。把它想象成股票价值。你想知道什么时候买卖股票可以获得最大的利润。
  • 可能的答案太多,或者对于这种格式来说,好的答案太长了。请添加详细信息以缩小答案集或隔离可以在几段中回答的问题。 + 你的例子对我没有意义。
  • @YassinHajaj 我正在考虑将数组分成两半并比较之后的值,但我真的不知道要返回什么值。
  • @Nbert 您必须检查某些值组合(倒数第二个,倒数第三个,倒数第二个,倒数第二个,倒数第二个, .... ,第三与第二,第三与第一,第二与第一)。这可以递归地完成。您返回以这种方式找到的最大值或自写类的某个对象,其中包含所有必要的信息。这当然只是众多可能的解决方案之一,但也许它可以帮助您入门。

标签: java arrays recursion iteration divide-and-conquer


【解决方案1】:

算法(这几乎是一个排序任务,然后减法步骤是微不足道的)

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

归并排序 (https://en.wikipedia.org/wiki/Merge_sort)

插入排序 (https://en.wikipedia.org/wiki/Insertion_sort)

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

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

【讨论】:

  • 这将导致 12 - 3 = 9,OP 明确表示这不是答案。
  • 如果您对数组进行排序,那么您不必担心顺序。我被特别要求实现一个分而治之的算法。
  • 我不得不承认我没有很好地解释我的问题是什么。此任务旨在模拟股票市场。您试图通过以最低价格购买并以最高价格出售来最大化您的利润。
  • 如果您试图模拟股票市场,那么您的方法可能是最糟糕的方法,因为股票数据是流式时间序列。确定价格是最低还是最高将基于历史建模,分析窗口也很重要。过去 1 秒、1 分钟、1 天、1 周的最低或最高价格,其相对值。此外,我的解释基于你承认的问题,你承认措辞不好。
【解决方案2】:

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

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

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

}

【讨论】:

  • 解决了我的问题,非常感谢!
  • 你能解释一下为什么中间必须是 left + (right-left)/2 吗?我希望它只是(right-left)/2
【解决方案3】:

好吧,我认为递归在这方面不是很有效。你可能永远不会这样做(除了家庭作业)。这样的事情会做到这一点:

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 作为更大的差异,我再次认为这不是一种有效的方法。迭代会更好。

我希望这会有所帮助。

【讨论】:

  • 我知道递归对于这个练习来说是愚蠢的,但其中一部分是迭代进行,另一部分是递归进行。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 2018-06-22
  • 2022-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多