2

私はこの演習を解決しようとしています:

整数 f : int -> int に対する関数があり、0 から n までの引数の範囲で単調増加するとします。つまり、任意の 0 ≤ i < n に対して fi < f (i + 1) です。さらに、f 0 < 0 および fn > 0 です。fi ≥ 0 で最小の引数 i を見つける関数検索 fn を記述します。

今、私はこれを書きました

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] 内)

どうしたの?私の実装は正しいですか?

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 に答える