不能从Jason Hickey的“Objective Caml”一书中进行练习

时间:2013-08-28 15:11:59

标签: ocaml

我正在尝试解决这个问题:

  

假设你有一个关于整数的函数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]中)

有什么不对? 我的实施是正确的吗?

3 个答案:

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