我在二进制搜索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号。
答案 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;