Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays OCaml-查找排序列表中缺失的最小数字_Arrays_Sorting_Ocaml - Fatal编程技术网

Arrays OCaml-查找排序列表中缺失的最小数字

Arrays OCaml-查找排序列表中缺失的最小数字,arrays,sorting,ocaml,Arrays,Sorting,Ocaml,我一直在尝试在OCaml中实现一个函数,该函数返回排序列表中丢失的最小数字(大于0) 这就是我所做的 let getMissingNumber l = let rec find min = function | [] -> min | t :: [] -> t + 1 | t1 :: t2 :: r -> if t2 - t1 > 1 then t1 + 1 else find min (t2 :: r)

我一直在尝试在OCaml中实现一个函数,该函数返回排序列表中丢失的最小数字(大于0)

这就是我所做的

let getMissingNumber l = 
        let rec find min = function
        | [] -> min
        | t :: [] -> t + 1
        | t1 :: t2 :: r -> if t2 - t1 > 1 then t1 + 1 else find min (t2 :: r)
    in find 1 l;;
结果如下:

# getMissingNumber [1; 4; 5];;
- : int = 2
# getMissingNumber [1; 2; 5];;
- : int = 3
# getMissingNumber [1; 2; 3];;
- : int = 4
# getMissingNumber [3; 4; 5];;
- : int = 6

除了最后一个,所有的结果都是正确的。有什么建议吗?

问题是,如果列表包含多个元素,此函数将永远不会返回1,因为
|t::[]->t+1
(如果
t>0

因此,我们可以将
|t:[]->t+1
替换为
|t:[]->min
,但在这种情况下,表单
[1;2;3;…;n]
的所有列表都会出现问题,因为在
|t1::t2::r
分支中,我们不会更改
min
,因此我们最终会返回1(即使正确的响应是
n+1

所以我们需要“更新”
min
,但有趣的是,如果我们将
find min(t2::r)
替换为
find(t2+1)(t2::r)
,我们将返回到原始函数

事实上,此函数搜索大于最小显示数的最小缺失数。主要问题是您无正当理由区分
[t]
t1::t2::r

let getMissingNumber l =
  let rec find min = function
    | [] -> min
    | t::r ->
       if t > min then min
       else find (t + 1) r
  in find 1 l

如果输入列表可能以小于1的值开始,则还需要跳过这些值

let getMissingNumber l = 
        let rec find min = function
        | [] -> min
        | h :: t when min < t -> min
        | h :: t when min = t -> find (min+1) t
        | _ :: t -> find min t
    in find 1 l
让getMissingNumber l=
让rec查找min=函数
|[]->min
|当最小值min时,h::t
|h::t当min=t时->查找(min+1)t
|_u3;::t->查找最小t
在查找1 l中

当您有一个单例
t:[]
(或
[t]
)时,您不需要比较检查值是否大于
min
。检查所有元素是否按顺序排列,如果是这种情况(如您的最后一个示例),请返回第一个元素减去1…但是否可以在您的函数中实现它-我不知道;)最后的结果真的错了吗?6是最小的正整数,它既大于输入列表的最小元素(aka 3),也不是列表的一部分。正如@octachron指出的,最后两个结果是相似的。也许返回
0
None
更有意义,因为在排序的序列中实际上没有丢失任何数字。