【发布时间】:2016-04-23 20:49:49
【问题描述】:
我有一组(随机)数字,我想确定任何给定数字,该数字是否是复合数字(意味着它可以由同一给定集合中的其他两个数字创建)。
我的函数的数学定义:
当前代码:
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 被“找到”为两个元素 s 和 t 的总和时,我无法从迭代中返回布尔结果。
我怎样才能尽可能有效地解决给定的问题?
如果有人发现算法的 total 运行时间小于 O(n²),那么我也可以。
[所有被调用的方法也必须比 O(n²) 快]
【问题讨论】:
-
这是偶然的功课吗?当有人要求一个对大 O 有限制的算法时,我只需要问。 O(n2) 对于这个问题是显而易见的。
-
@GuyCoder:嗯,这是一项任务,可能会在以后的考试中出现,我目前正在尝试用 F# 编写它;)谢谢您的第二条评论,先生 - 我意识到我忘记了
not -
在这种情况下,使用 Seq.find 代替循环
-
且无需注解类型,只需指定
inline -
@FoggyFinder:
Seq.find很整洁,不过我会看看它的性能...