我很确定这个问题很简单。不幸的是,我是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
使函数无法使用?
答案 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
从上方传递给内部函数。可以轻松修改此功能以添加第三,第四等数量的列表,我将作为练习留给您:)
此代码也没有进行任何安全检查以确保您传递有效输入,它假定所有内容都是犹太人进入。