我正在尝试解决这个问题:
假设你有一个关于整数的函数f:int - &gt; int是单声道 - 在从0到n的某些范围内逐渐增加。那是, f i&lt; f(i + 1)对于任何0≤i<1。 ñ。另外,f 0 < 0和f n>写一个 函数搜索f n找到最小的参数i,其中fi≥0。
现在我写了这个
let search f n =
let min = f 0 in
let rec searchin i =
if i >= n then min
else
if f min > f i then min = i
searchin i+1;;
但它因错误而崩溃:
错误:解析错误:[绑定]之后预期的“in”(在[expr]中)
有什么不对? 我的实施是正确的吗?
答案 0 :(得分:3)
let search f n =
let min = f 0 in
let rec searchin i =
if i >= n then min
else
if f min > f i then min = i;
searchin i+1 in searchin 0;;
你忘了给这个功能打电话。
无论如何它是错误的,正确的搜索是
let search f n =
let rec searchin i =
if i>=n then failwith("error that is not possible")
else if f i >0 then i-1 else searchin (i+1)
in
searchin 0;;
你也可以用循环搜索
let search f n =
let i = ref 0 in
while f (!i) < 0 do
i:= !i +1;
done;
!i;;
答案 1 :(得分:0)
为什么不使用二分搜索:
let rec binarysearch begin end func =
if begin=end
then begin
else
let m=(begin+end)/2 in
if (func m)<0
then binarysearch (m+1) end func
else binarysearch begin m func;;
答案 2 :(得分:-1)
nlucaroni的功能不起作用。正确的解决方案如下
let search f n =
let rec aux i =
if i>n then
failwith("error that is not possible")
else
(if f i >=0 then
i
else
aux (i+1))
in aux 0;;