gpt4 book ai didi

loops - F# - 从 for .. 返回一个值

转载 作者:行者123 更新时间:2023-12-04 23:17:20 25 4
gpt4 key购买 nike

我有一组(随机)数字,我想确定任何给定数字,该数字是否是复合数字(这意味着它可以由同一给定集合中的两个其他数字创建)。
我的函数的数学定义:

enter image description here

当前代码:

let task1 (M : seq<'T>, r : 'T) : bool =
if not(Seq.exists((=) r) M) then
failwith "nope!"
else
for s in M do
for t in M do
if s + t = r then
true // error
false

问题:
当元素 r 时,我无法从迭代中返回 bool 结果已被“找到”为两个元素的总和 st .

我怎样才能尽可能有效地解决给定的问题?

如果有人找到一个带有 的算法总计 运行时间小于 O(n²),那么我也可以。

[所有被调用的方法也必须比 O(n²) 快]

最佳答案

你不能做你想做的事,因为 F# 是一种使用表达式而不是语句的语言。 F# 表达式总是计算出一个值(尽管该值可能是 unit: () )。

您最初发布的代码无法编译,因为类型为 unit是预期的,那是因为你的 if/then表达式没有 else分支。考虑以下:

let a = if x > 5 then 10

这段代码会产生一个编译错误,这很明显,因为我们没有指定 a的整数值是多少。可能是 x不大于 5。

当然,这段代码会编译:
let a = if x > 5 then 10 else 5

如果您提供和 if没有 else ,F# 编译器将假定类型为单位,因此这也是有效代码:
let a = if x > 5 then ()

这是因为这两种情况仍然只返回 unit ,没有类型不匹配。

因为 F# 使用表达式,所以所有内容都必须绑定(bind)到一个值。

无论如何,你可以通过使用嵌套 Seq.exists 来解决这个问题。语句,这样您就可以检查值的每个组合。
let inline task1 items r =
items |> Seq.exists (fun s ->
items |> Seq.exists(fun t -> s + t = r))

我已经更改了一些命名约定(F# 函数参数的习惯用法是驼峰式),并使您的函数 inline所以它适用于任何支持加法的类型。

关于loops - F# - 从 for .. 返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com