2016-10-03 59 views
0

我很确定这个问题很微不足道。不幸的是,我是Ocaml编程的新手,然后我正在寻找错误的方向,很可能。最大值之和

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

我迄今为止最好的尝试:

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 

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

当我尝试添加第三个值的问题上升为什么第三个值z使功能无法使用?

+0

分而治之!函数式编程鼓励合成,即找到最大的n - >总和 – karakfa

+0

我不明白这两个版本如何满足您的要求;当然,如果规范是“总和n个最大值”,那么n必须是该函数的一个参数,但我不会在任何地方看到它。**在担心身体问题之前,首先获取正确的功能签名**。如果您的问题是对事物列表中的n个最大元素求和,那么签名必须包含* list *和* count *。得到这个权利,并使该方法返回一个*错误的*值,现在你至少有一些东西可以开始测试,而你的身体是正确的。 –

+0

此外,为什么该方法调用'sumsqr'而不是'sum_largest_values',如果这就是它的作用? –

回答

1

如果我理解正确的问题,你是想采取如输入的两个int list和一个int说法,取两个int lists的级联的最大n价值观和总结呢?

(* 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 

在这个函数中,我们添加yx和排序按降序排列结果列表z,然后从上面通过所产生的int list我们内在功能。这个功能可以很容易地修改,以添加第三,第四等数量的清单,我将留给你作为练习:)

此代码也不会做任何安全检查,以确保您通过有效投入,它假设一切都是犹太教进来。

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个最大值并将它们相加

您可以尝试将数字放入数组或列表中,对列表进行排序,获取排序列表中的n个第一个元素并将它们相加。