加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala Stream [Int] #foldLeft和Stream [Int] #sum给出不同的结

发布时间:2020-12-16 18:22:06 所属栏目:安全 来源:网络整理
导读:这个问题与 euler project sum-of-primes,and Stream.view有关,但有一点扭曲.我想计算低于200万的所有素数的总和.我创建了一个素数生成器,定义为: lazy val primes: Stream[Int] = 2 #:: Stream.from(3).filter(i = primes.takeWhile(j = j * j = i).forall
这个问题与 euler project sum-of-primes,and Stream.view有关,但有一点扭曲.我想计算低于200万的所有素数的总和.我创建了一个素数生成器,定义为:

lazy val primes: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
  primes.takeWhile(j => j * j <= i).forall(i % _ > 0))

我写了两个测试,一个使用Stream [Int] #foldLeft,另一个使用Stream [Int] #sum:

@Test
 def testEuler010a {
   primes.view.takeWhile(_ < 2000000).foldLeft(0L)(_ + _) mustEqual 142913828922L
 }

 @Test
 def testEuler010b {
   primes.view.takeWhile(_ < 2000000).sum mustEqual 142913828922L
 }

testEuler010a给出了正确的答案,而testEuler010b没有得到1179908154的答案.我希望Stream [Int] #foldLeft(0L)(_ _)与Stream [Int] .sum相同,但事实并非如此.即使我使用toList()实现Stream,我也会遇到相同的差异.这些方法应该给出相同的结果是不正确的假设吗?

我正在使用Scala 2.9.1.final.

解决方法

问题似乎是溢出.这些给我的结果相同:

(primes map (_.longValue) takeWhile (_ < 2000000)).sum
(primes map (_.longValue) takeWhile (_ < 2000000)).foldLeft(0L)(_ + _)

我认为sum和foldLeft之间的区别在于sum的结果类型与被求和的元素的类型相同(根据Numeric trait的要求),但foldLeft可以有不同的结果类型,您可以通过编写0L来实现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读