最大值的总和

时间:2016-10-03 16:14:06

标签: ocaml

我很确定这个问题很简单。不幸的是,我是Ocaml编程的新手,然后我很有可能找错了方向。

我想创建一个函数sum_largest_values,它在输入之间取n个最大值并对它们求和。

到目前为止我的最佳尝试:

utop # let sum_largest_values (x:int)(y:int) = 
if (x > y) || (y > x) then ((+) x y)
else 
0;;

当我尝试添加第三个值时,问题就出现了:

utop # let sum_largest_values (x:int)(y:int)(z:int) = 
if (x > y > z) || (y > x > z) then ((+) x y)
else 
0;;

我无法定义这样的功能:

Error: This expression has type int but an expression was 
expected of type bool 

为什么第三个值z使函数无法使用?

2 个答案:

答案 0 :(得分:1)

如果您想直接比较3个或更多数字,则不能这样做:

# 1<2<3;;
File "", line 1, characters 4-5:
Error: This expression has type int but an expression was expected of type bool

您可以构建更复杂的条件:

# (1<2) && (2<3);;
- : bool = true
# ((1<2) && (2<3)) || ((3<4) && (4<5));;
- : bool = true

但回到原来的问题

  

sumsqr,它取输入之间的n个最大值并将它们相加

您可以尝试将数字放在数组或列表中,对列表进行排序,取出排序列表的第一个元素并对它们求和。

答案 1 :(得分:1)

如果我正确理解了这个问题,那么您希望将两个int list和一个int参数作为输入,取两个n的串联值int lists 1}}并总结它们?

(* first, make an inner function to store running total *)
let rec sum_largest_inner l n acc =
  match n with
      0 -> acc
    | x -> match l with
               [] -> 0
             | h :: t -> sum_largest_inner t (x-1) (h+acc)

该功能正在做什么,只需要一个int list并将第一个n值相加并将其存储在acc中。这个内部函数假设int list已经按降序排序,所以我们要确保传入有效的int list

let sum_largest_values x y n =
  let z = List.sort compare (x @ y) in
  sum_largest_inner (List.rev z) n 0

在此函数中,我们将y附加到x并按降序对结果列表z进行排序,然后将生成的int list从上方传递给内部函数。可以轻松修改此功能以添加第三,第四等数量的列表,我将作为练习留给您:)

此代码也没有进行任何安全检查以确保您传递有效输入,它假定所有内容都是犹太人进入。