F# 如何求和;“任何三个要素”;在F中的元组中#

F# 如何求和;“任何三个要素”;在F中的元组中#,f#,F#,我最近开始学习如何用F#编程,我有一项任务让我非常头疼 我必须创建一个函数,它包含两个参数,一个整数和一个由五个元素组成的整数元组,如果元组中任意三个元素的和大于第一个参数,则返回true,否则返回false 我开始这样设计我的代码 { let t3 = (1, 2, 3, 4, 5) let intVal = 1 let check intVal t3 = for t3 if (*sum of any three elements*) > intVal then true

我最近开始学习如何用F#编程,我有一项任务让我非常头疼

我必须创建一个函数,它包含两个参数,一个整数和一个由五个元素组成的整数元组,如果元组中任意三个元素的和大于第一个参数,则返回true,否则返回false

我开始这样设计我的代码

{
let t3 = (1, 2, 3, 4, 5)
let intVal = 1
let check intVal t3 = 
for t3
    if (*sum of any three elements*) > intVal then true
    else false
}

但是在这一点上,我被卡住了,不知道如何继续。

可以通过将元组转换为一个数组,从中获取可能的组合,对这些组合求和,然后验证其中任何一个和是否大于您的参数来解决

(1,2,3,4,5) 
|> Microsoft.FSharp.Reflection.FSharpValue.GetTupleFields 
|> Array.toList 
//Implementing this is left as and exercise to the reader
|> combinations 3 
//converts the obj list as a int list and then sums the elements
|> List.map (fun x -> x |> List.map unbox<int> |> List.sum) 
//Verifies if any sum is greater than intVal
|> List.exists (fun x -> x > intVal)
(1,2,3,4,5)
|>Microsoft.FSharp.Reflection.FSharpValue.GetTupleFields
|>数组.toList
//实现这一点留给读者作为参考和练习
|>组合3
//将obj列表转换为整数列表,然后对元素求和
|>List.map(乐趣x->x |>List.map unbox |>List.sum)
//验证是否有任何总和大于intVal
|>List.exists(乐趣x->x>intVal)

像这样的东西应该可以做到:

let cross3 l1 l2 l3 =
    [
        for x in l1 do
            for y in l2 do
                for z in l3 do
                yield x, y, z ]

module Tuple3 =
    let distinct (x, y, z) =
        let l = [x; y; z]
        l |> List.distinct |> List.length = l.Length

    let snd (x, y, z) = snd x, snd y, snd z

    let inline sum (x, y, z) = x + y + z

let inline isAnyThreeGreaterThan limit (x1, x2, x3, x4, x5) =
    let l = [x1; x2; x3; x4; x5] |> List.indexed
    let legalCombinations =
        cross3 l l l
        |> List.filter Tuple3.distinct
        |> List.map Tuple3.snd
    legalCombinations |> List.exists (fun t3 -> Tuple3.sum t3 > limit)
由于这是一个作业,我将把它作为一个练习来理解正在发生的事情,但这里是一个FSI课程示例:

> isAnyThreeGreaterThan 15 (1, 2, 5, 5, 5);;
val it : bool = false
> isAnyThreeGreaterThan 14 (1, 2, 5, 5, 5);;
val it : bool = true
> isAnyThreeGreaterThan 15 (1, 2, 5, 5, 6);;
val it : bool = true
> isAnyThreeGreaterThan 15 (1, 2, 3, 4, 5);;
val it : bool = false
> isAnyThreeGreaterThan 12 (1, 2, 3, 4, 5);;
val it : bool = false
> isAnyThreeGreaterThan 11 (1, 2, 3, 4, 5);;
val it : bool = true

定义-对元组的元素进行排序,并与最后三个元素的总和进行比较(升序排序):

例如:

isAnyThreeGreaterThan2 15 (1, 2, 5, 5, 5) |> printfn "%A"
isAnyThreeGreaterThan2 14 (1, 2, 5, 5, 5) |> printfn "%A"
isAnyThreeGreaterThan2 15 (1, 2, 5, 5, 6) |> printfn "%A"
isAnyThreeGreaterThan2 15 (1, 2, 3, 4, 5) |> printfn "%A"
isAnyThreeGreaterThan2 12 (1, 2, 3, 4, 5) |> printfn "%A"
isAnyThreeGreaterThan2 11 (1, 2, 3, 4, 5) |> printfn "%A"
打印:

false
true
true
false
false
true
链接:


很好的开箱思考!我希望我已经想到了:)不幸的是,我不能使用这些。我只允许使用“匹配”来做这件事,这就是我的问题所在
false
true
true
false
false
true