热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【SICP练习】16练习1.22

练习1.22这道题中需要判断素数的部分书中都已经列出来了,但要求是要找出多个素数,因此我们要有一个能够不断求素数的函数。在C等语言中我们可以通过一个fo


练习1.22

这道题中需要判断素数的部分书中都已经列出来了,但要求是要找出多个素数,因此我们要有一个能够不断求素数的函数。在C等语言中我们可以通过一个for循环来轻易地求出来,在Scheme中我们完全可以用迭代来实现这一功能。另外因为是要的素数,因此完全不用考虑偶数了。于是我们先来写一个不断求奇数的函数。

(define (odd-after-x x)

      (if(odd? x)

        (+ 2 x)

        (+ 1 x)))

通过将偶数加1、奇数加2,轻易地求出了x之后的奇数。

判断素数的函数我们直接列出了:

(define (prime? n)

(define (smallest-divisor n)

        (find-divisor n 2))

(define (find-divisor n test-divisor)

         (cond((> (square test-divisor) n) n)

         ((divides? test-divisor n) test-divisor)

         (else (find-divisor n (+ test-divisor 1)))))

(define (divides? a b)

         (= (remainder b a) 0))

(= n (smallest-divisor n)))

下面我们利用这两个函数来定义一个不断产生素数的函数:

(define (prime-after-prime n count)

      (cond((= count 0) (display “These are all prime numbers”))

              ((prime? n) (display n)

                                (newline)

                                 (prime-after-prime (odd-after-x n) (- count1)))

               (else (prime-after-prime (odd-after-x n)count))))

如此一来便能够按照书中的要求算出一千、一万等的3个最小的素数了,不过还不能计算所需时间。而要求时间,我们可以用real-time-clock,这在【Scheme归纳】7中有相关介绍。下面我们就来将计算时间的功能加入进去。

(define (get-time&prime n)

      (let((start-time (real-time-clock)))

       (prime-after-prime n 3)        由于题目中只要求求出3个最小的素数即可。

       (- (real-time-clock) start-time)))

下面我们就来开始测试了:

(get-time&prime 1000)

1009

1013

1019

These are all prime numbers

;Value: 0

时间太短记为0了我也没办法,下面再来几组大的。

(get-time&prime 10000)

10007  

10009

10037

These are all prime numbers

;Value: 0

还是0,莫非函数错了?再来一次。

(get-time&prime 100000)

100003

100019

100043

These are all prime numbers

;Value: 0

我也不知道为什么会这样了,用一百万测试的还是0,难度是i7的速度快?不过:

(get-time&prime 10000000)

10000019

10000079

10000103

These are all prime numbers

;Value: 15

继续,一亿用了47微秒,10亿用了157微秒。100亿、一千亿、一万亿用了67217505156。一亿亿用了621890秒,3个最小的素数分别是100000000000000611000000000000006910000000000000079

后来在网上也看到相同的函数,而对方评论下说对方写错了。我再看看书中的内容发现果然如此,我也看错了,第36页上面说的是检查每个素数所需要的时间,应该是意味着每个素数都要有个时间吧?如是将函数改成了这样:

(define (get-time&prime n)

  (let((start-time (real-time-clock)))

     (define (prime-after-prime n count)

     (cond ((= count 0) (display "These areall prime numbers."))

              ((prime? n) (display n)

                             (display (- (real-time-clock)start-time))

                       (newline)

                           (prime-after-prime(odd-after-x n) (- count 1)))

               (else (prime-after-prime (odd-after-x n)count)))))

     (prime-after-prime n 3)))

因为觉得返回更多的素数结果会更加准确,于是我在测试的时候将最后一行代码的3改成了5。通过测试,在100010000中的每个素数的计算时间都是010万和100万也都是零。我觉得是因为这本书的历史比较久远了,当时的硬件比不上现在的了。于是我又用了一千万来测试,返回的5个时间分别是015151531,用一亿来测试返回的5个时间分别是1531476278,和根号10的差距不是太遥远吧。十亿返回的5个时间分别是4794141297391。至此这道习题就算做完了,稍有不足都请读者列出。


推荐阅读
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
  • R开发:协调过滤推荐
    set.seed(1234)#加载数据包library(“recommenderlab”)#构造数据运用recommenderlab包实现协同过滤推荐,其数据类型采用S4类构造,需 ... [详细]
  • 开发笔记:AJAX了解内容
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了AJAX了解内容相关的知识,希望对你有一定的参考价值。1.什么是AJAX?AJAX ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • STM32串口通信:完整指南
    众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • 自动验证时页面显示问题的解决方法
    在使用自动验证功能时,页面未能正确显示错误信息。通过使用 `dump($info->getError())` 可以帮助诊断和解决问题。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
author-avatar
66代码
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有