1

不应该

if(a[mid] < t)return BS(mid+1,high);
else return BS(low,mid);

一样

if(a[mid] > t)return BS(low,mid-1);
else return BS(mid,high);

但是第二个不起作用,为什么?

编辑:我的意思是不起作用,代码没有达到基本情况。

4

1 回答 1

3

在将 mid 计算为 (low+high)/2 时,它使用整数除法。

在布雷夫。举例

让 low = 3 , high = 4 , a[3] >= t

所以通过调用 BS(low,high) mid = (3+4)/2 = 3 #Integer_division

由于 a[mid] >=t 所以返回 BS(mid,high) 相当于 BS(low,high) #infinite_loop

解决方案使用你身边的整数除法所以代码应该像

if(a[mid] >= t)return BS(low,mid);
else return BS(mid+1,high);

认为这将解决您的问题。

于 2013-06-27T00:02:24.920 回答