【发布时间】:2013-12-22 02:02:45
【问题描述】:
我是 Clojure 编程的新手,想知道执行以下操作的惯用方式是什么:
我想对一组数字
nums求和,其中可能包含大量数字,假设只有正数。如果总和非常大,我不在乎确切的总和。例如,如果数字的总和大于 9999,我会简单地返回 10000,而不会将剩余的数字相加。
如果我用一些 OO 语言如 Java 来实现它,我可能会这样做:
private int sum(int[] nums) {
int sum = 0;
for(int n : nums) {
if(sum > 9999) {
sum = 10000;
break;
} else {
sum += n;
}
}
return sum;
}
Clojure 中的简单实现可能如下所示:
(let [sum (reduce + nums)]
(if (> sum 9999) 10000 sum))
但是,这似乎浪费了一些 CPU 资源来汇总整个数字集合,这是不希望的。我正在寻找像 take-while 功能但用于减少的东西,但找不到它。有没有类似的东西:
(reduce-while pred f val coll)
或者有没有其他 Clojure 惯用的方法来解决这个问题?我认为该解决方案可以应用于一组需要类似逻辑的问题。
感谢任何评论。谢谢。
【问题讨论】:
标签: clojure