大型列表或范围的总和超出了范围

时间:2014-06-19 17:02:35

标签: groovy

我正在玩groovy并编写简单的一行程序:

groovy -e "(1..100_000).each{println((1..it).sum())}"

结果通过管道传输到'>'。

我遇到了两个主要问题:

  1. 这需要太长时间(我将其与类似的python脚本进行比较)
  2. 输出超出范围,我的总和在一段时间后变为负数
  3. 我怎样才能加快执行速度,并在总和结果中留下长篇大论。

2 个答案:

答案 0 :(得分:1)

所以,您已经回答了问题的第2部分。在使其运行更快方面,您可以递归地定义逻辑并利用memoization

groovy -e "@groovy.transform.Memoized c(BigInteger i) { i == 1 ? 1 : c(i - 1) + i }; (1..100_000).each { println c(it) }"

答案 1 :(得分:0)

我发现如何确定范围内的数字,而不是int:

groovy -e "(1..100_000).each{println((1..(it as long)).sum())}"

或使用BigInteger:

groovy -e "(1..100_000).each{println((1..it).sum(0G))}"

仍然不了解性能问题,如果我能做些什么来加速这个脚本。