实现二进制搜索但找不到元素

时间:2019-09-04 14:20:02

标签: sml smlnj

我在二进制搜索sml中有一个代码,问题是当我搜索20时,输出显示即使数组有20个,数组中也没有元素。 我不知道为什么会这样。

    open Array;

fun binsearch (A, x) = 
    let val n = length A;
      val lo = ref 0 and hi = ref n;
      val mid = ref ((!lo + !hi) div 2);

    in  
      while ((!hi - !lo > 1) andalso (x <> sub (A, !mid))) do
      (
        if x < sub (A, !mid) then hi := !mid - 1
        else  lo := !mid + 1;
        mid := (!lo + !hi) div 2
       );

          if x = sub (A, !mid) then SOME (!mid)
      else NONE
    end;


open Array;
val A = fromList [~24, ~24, ~12, ~12, 0, 0, 1, 20, 45, 123];
binsearch (A, 20);
binsearch (A, ~24);
binsearch (A, 123);

代码无法搜索20号。

1 个答案:

答案 0 :(得分:0)

此错误的原因是(!hi - !lo > 1)中的一个错误,应该是(!hi - !lo > 0)(!hi - !lo >= 1)

但是,

ML旨在成为一种功能语言。更具功能性的方法(即没有引用和while循环)可能像这样:

fun binsearch arr x =
let
  val l = Array.length arr
  fun subsearch arr x lo hi =
    if lo > hi then NONE
    else
      let
        val mid = (lo + hi) div 2
        val v = Array.sub (arr, mid)
      in
        if x < v then subsearch arr x lo (mid-1)
        else if x > v then subsearch arr x (mid+1) hi
        else SOME mid
      end
in
  subsearch arr x 0 (l-1)
end;