为什么“ int mid =(left-right)/ 2 + right”会导致堆栈溢出?

时间:2019-01-15 22:25:47

标签: java arrays stack-overflow

我今天写了合并排序的代码,运行starttime=time.time() while True: %run "script1.py" if (time.time() - starttime) >= 240.0 %run "script2.py" time.sleep(60.0 - ((time.time() - starttime) % 60.0)) 时遇到了StackOverFlow错误。但是当我使用int mid = (left - right)/2 + right;时,一切都很好。我很困惑,因为他们两个的数学含义是相同的(如果不是,为什么?)。

我已经看到了这个问题,但是我不确定它是否可以解决这个问题。 why left+(right-left)/2 will not overflow?

这是我的代码,很抱歉以前我没有上传代码。

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

1 个答案:

答案 0 :(得分:2)

运行此命令时,迟早left可能比right小1,例如left = 3right = 4

在这种情况下,(left - right) / 2(right - left) / 2的求和结果均为0,因为整数除法将取整为零。所以,如果你有

int mid = (left - right)/2 + right;
sort(array, helper, left, mid);

在调用sort(array, helper, left, right)内,那么您将重复使用完全相同的值进行的呼叫。这将导致无限递归-StackOverflowError

但是当你拥有

int mid = left + (right - left)/2;
sort(array, helper, left, mid); 

然后您要使用不同的值重复通话,因此递归有机会结束。