Functional programming OCaml中排序数组内的二进制搜索 让我们查找arr字= 让rec binarysrach arr word min max= 让中间=(最小+最大)/2英寸 如果最大值

Functional programming OCaml中排序数组内的二进制搜索 让我们查找arr字= 让rec binarysrach arr word min max= 让中间=(最小+最大)/2英寸 如果最大值,functional-programming,ocaml,ocaml-batteries,Functional Programming,Ocaml,Ocaml Batteries,我正在用OCaml做二进制serach。这个代码有什么问题?它总是返回-1。它是一个字符串数组,因此比较元素时,如果它们相等,则会给出值0、-1或1,第一个元素较小,第一个元素较大(文档中说明了正整数和负整数,但我在解释器中进行了测试,并收到了1和-1)。关于我在这里犯的错误有什么暗示吗 如果(String.compare arr.(mid)word=1)将此更改为-1 String.compare如果左侧大于右侧,则返回1 注意:采用的一般方法包含维基百科文章中描述的已知小错误: 基本上,将

我正在用OCaml做二进制serach。这个代码有什么问题?它总是返回-1。它是一个字符串数组,因此比较元素时,如果它们相等,则会给出值0、-1或1,第一个元素较小,第一个元素较大(文档中说明了正整数和负整数,但我在解释器中进行了测试,并收到了1和-1)。关于我在这里犯的错误有什么暗示吗

如果(String.compare arr.(mid)word=1)将此
更改为
-1

String.compare
如果左侧大于右侧,则返回
1

注意:采用的一般方法包含维基百科文章中描述的已知小错误:


基本上,将
mid
计算为
(min+max)/2
会对足够大的数字产生整数溢出。

当使用=,而不是String.compare时,会产生相同的结果。所以问题是,你能添加调用代码吗?
find[|“a”;“b”;“c”|]“a”
returns-1@Grozz
let find arr word =
  let rec binaryserach arr word min max =
    let mid = (min + max) / 2 in
    if max < min then -1 else
    if (String.compare arr.(mid)  word = 0) then mid else 
    if (String.compare arr.(mid)  word = 1) then (binaryserach arr word (mid+1) max) else
      binaryserach arr word min (mid-1) in 
  binaryserach arr word 0 ((Array.length arr) - 1) ;;