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

在Scala中计算素数:这段代码如何工作?

发布时间:2020-12-16 09:19:11 所属栏目:安全 来源:网络整理
导读:所以我花了几个小时试着弄清楚这个代码如何产生素数. lazy val ps: Stream[Int] = 2 #:: Stream.from(3).filter(i = ps.takeWhile{j = j * j = i}.forall{ k = i % k 0}); 我使用了很多printlns等,但是nothings使它更清晰. 这就是我认为的代码: /** * [2,3]
所以我花了几个小时试着弄清楚这个代码如何产生素数.

lazy val ps: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
   ps.takeWhile{j => j * j <= i}.forall{ k => i % k > 0});

我使用了很多printlns等,但是nothings使它更清晰.

这就是我认为的代码:

/**
 * [2,3] 
 * 
 * takeWhile 2*2 <= 3 
 * takeWhile 2*2 <= 4 found match
 *      (4 % [2,3] > 1) return false.
 * takeWhile 2*2 <= 5 found match
 *      (5 % [2,3] > 1) return true 
 *          Add 5 to the list
 * takeWhile 2*2 <= 6 found match
 *      (6 % [2,3,5] > 1) return false
 * takeWhile 2*2 <= 7
 *      (7 % [2,5] > 1) return true
 *          Add 7 to the list
 */

但是,如果我将列表中的j * j更改为2 * 2,我认为这将完全相同,则会导致一个stackoverflow错误.

我显然在这里缺少一些基本的东西,真的可以使用一个向我解释的人,就像我五岁.

任何帮助将不胜感激.

解决方法

我不知道寻求程序性/必要性的解释是在这里获得理解的最佳途径. Streams来自功能性编程,从这个角度来看,它们是最好的解释.您给出的定义的关键方面是:

>这很懒惰除了流中的第一个元素之外,在您要求之前,不会计算任何内容.如果你永远不要求第五个素数,它将永远不会被计算出来.
>它是递归的.素数列表本身就是定义的.
这是无限的流具有有趣的属性(因为它们是懒惰的),它们可以表示具有无数个元素的序列. Stream.from(3)是一个例子:它代表列表[3,4,5,…].

我们来看看我们是否可以理解为什么你的定义计算素数的序列.

定义从2#:: ….开始.这只是说序列中的第一个数字是2 – 到目前为止还不够简单.

下一个部分定义其余的素数.我们可以从3开始的所有计数号(Stream.from(3))开始,但是我们显然需要对这些数字进行过滤(即所有的复合物).所以让我们考虑每个号码我.如果我不是较小素数的倍数,那么我是素数.也就是说,我是素数,如果对于所有素数k小于i,i%k>在Scala中,我们可以将其表示为

nums.filter(i => ps.takeWhile(k => k < i).forall(k => i % k > 0))

然而,实际上并不需要检查所有较小的素数 – 我们只需要检查其平方小于或等于i的素数(这是数理论*的一个事实).所以我们可以改写

nums.filter(i => ps.takeWhile(k => k * k <= i).forall(k => i % k > 0))

所以我们得出你的定义.

现在,如果你碰巧尝试了第一个定义(用k k< i))).第一个素数是2,小于3 - 到目前为止这么好.但是我们还不知道第二个素材,所以我们需要计算它.好的,所以我们需要先看看是否属于... BOOM! *很容易看出,如果数字n是复合的,则其中一个因子的平方必须小于或等于n.如果n是复合的,则根据定义n == a * b,其中1 < a< = b< n(我们可以通过适当地标注两个因素来保证< = b).从< = b可以看出,a 2 = a * b,因此遵循a ^ 2 <= n. ),你会发现它没有起作用.为什么不?它与这是一个递归定义的事实有关.>

(编辑:李大同)

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

    推荐文章
      热点阅读