检查列表是否在Ocaml中排序

时间:2014-03-14 15:36:09

标签: list sorting recursion ocaml

为什么以下代码有误? 即使前两个结果是正确的,但最后一个结果应该返回false,它返回true。为什么这样?

let rec is_sorted x = match x with
|h::h2::[] -> if h <= h2 then true else false
|h::h2::t -> if h <= h2 then is_sorted h2::t else false

# is_sorted [4;5;6;5;9];;
- : bool = false
# is_sorted [4;5;6;7;9];;
- : bool = true
# is_sorted [4;5;6;18;9];;
- : bool = true       

3 个答案:

答案 0 :(得分:1)

我将写下以下内容:

let rec is_sorted x = match x with
  | [] -> true
  | h::[] -> true
  | h::h2::t -> if h <= h2 then is_sorted (h2::t) else false;;

然后:

# is_sorted [];;
- : bool = true
# is_sorted [1];;
- : bool = true
# is_sorted [4;5;6;5;9];;
- : bool = false
# is_sorted [4;5;6;7;9];;
- : bool = true
# is_sorted [4;5;6;18;9];;
- : bool = false

答案 1 :(得分:0)

稍短一些:

let rec is_sorted = function
  | x::y::l -> x <= y && is_sorted (y::l)
  | _ -> true

答案 2 :(得分:0)

这就是我要做的。

let rec sorted x =
   match x with
   | [] -> true
   | [_] -> true
   | a::b::t when a <= b -> sorted (b::t)
   | _ -> false
;;