2

我正在尝试解决这个练习:

假设你有一个关于整数 f 的函数:int -> int,它在从 0 到 n 的某个参数范围内单调递增。也就是说,对于任何 0 ≤ i < n,fi < f (i + 1)。此外,f 0 < 0 和 fn > 0。编写一个函数 search fn,找到 fi ≥ 0 的最小参数 i。

现在我写了这个

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;;

但它会因错误而崩溃:

错误:解析错误:在 [binding] 之后需要“in”(在 [expr] 中)

怎么了?我的实现是正确的吗?

4

3 回答 3

4
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;;
于 2013-08-28T15:22:34.057 回答
1

为什么不使用二进制搜索:

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;;
于 2014-01-01T02:08:59.237 回答
-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;;
于 2017-02-15T00:52:34.940 回答