我今天写了合并排序的代码,运行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;
答案 0 :(得分:2)
运行此命令时,迟早left
可能比right
小1,例如left = 3
和right = 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);
然后您要使用不同的值重复通话,因此递归有机会结束。