我是Clojure编程的新手,想知道以下事情的惯用方式:
我想要对一个数字集合
nums
求和,其中可能包含大量数字,假设这些数字都为正数。如果数字总和非常大,我不关心确切的总和。例如,如果数字总和大于9999,我将简单地返回10000,而根本不会对其余数字求和。
如果我使用一些面向对象的语言(如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 的东西,但找不到。是否有类似于:
(reduce-while pred f val coll)
还有其他Clojure惯用的方法来解决这个问题吗?我认为这种解决方案可以应用于一组需要类似逻辑的问题。
欢迎任何评论。谢谢。