SICP 1.23-1.26体会

计算机程序的构造与解释(SICP) 计划用半年的时间把《计算机程序的构造与解释》这本书读完,并完成一半以上的习题。 所用的软件: 系统:windows xp 解释器:DrRacket, version 5.1 语言:SICP(PLaneT 1.13) ,如何获得该语言,请看这里。 习题答案目录: 第1章 构造过程抽象 1.1节 程序设计基本元素1.2节 过程与它们所产生的计算 第2章 构造数据抽象 阅读详情

1.23 代码改动很简单, 关键是时间。 电脑上算了一下, 100000000以下全是0, 开始还以为代码写错了。

          最后没办法, 用1e10 1e11来计算, 发现比 1e11 1e12快1.2-1.5之间。比2小。想了半天也给不出很合理的解析。

         开始以为是对3 5 7 取余数 比 4 6 8 要慢, 测试了一下,发现也不是这么一回事。网上有人怀疑是函数调用花了一定时间做if 判断, 老实说这东西性能影响也不应有这么大。

         现在唯一想到的,就是编译器做了一些优化,导致性能不完全取决于调用次数。

         这题目,网上也没找到很合理的分析。

1.24  也很遗憾, 开始将times设为10, 计算时间1e10以下完全是0. 后面没办法,将times设为10000, 结果发现时间也很漂浮不定。

          有时候, 1e12-1e13 比 1e11-1e12计算速度还快。 只能说random导致性能很随机了。

1.25 理论上肯定是对的, 时间上就悲剧了。我这边执行 100000000 1000000000区间,直接死机。

         根本原因,还是我们的CPU是32或64位的, 不是无限位。

1.26 这个题目算法导论有清晰的解析。套用算法导论的公式T(n) = 2T(n/2) 可知道 T(n) = Theta(n)

        坦率地说, SICP不是学算法的好书。 也不是讲数据结构的好书。


个人代码如下:

1.23

(define (search-for-primes-new start end count)
    (define (timed-prime-test n)
(newline)
        (display n)
(start-prime-test n (runtime)))
    (define (start-prime-test n start-time)
(if (prime? n)
   (report-prime (- (runtime) start-time))
   0))
    (define (report-prime elapsed-time)
(display " *** ")
        (display elapsed-time)
1)
    (define (prime? n)
(= n (smallest-divisor-new n)))
    (define (smallest-divisor-new n)
(define (find-divisor n test-divisor)
   (cond ((> (square test-divisor) n) n)
 ((divides? test-divisor n) test-divisor)
 (else (find-divisor n (next test-divisor)))))
      (define (divides? a b)
 (= (remainder b a) 0))
      (define (next test-divisor)
 (if (= test-divisor 2)
     3
     (+ test-divisor 2)))
      (find-divisor n 2))
    (define (search-iter start end count)
(if (or (> start end) (= count 0))
   0
   (if (= (timed-prime-test start) 1)
(search-iter (+ start 1) end (- count 1))
(search-iter (+ start 1) end count))))
    (search-iter start end count))


1.24

(define (search-for-primes-new start end count)
    (define (timed-prime-test n)
(newline)
        (display n)
(start-prime-test n (runtime)))
    (define (start-prime-test n start-time)
(if (fast-prime? n 10000)
   (report-prime (- (runtime) start-time))
   0))
    (define (report-prime elapsed-time)
(display " *** ")
        (display elapsed-time)
1)
    (define (search-iter start end count)
(if (or (> start end) (= count 0))
   0
   (if (= (timed-prime-test start) 1)
(search-iter (+ start 1) end (- count 1))
(search-iter (+ start 1) end count))))
    (search-iter start end count))
(define (expmod base exp m)
(cond ((= exp 0) 1)
     ((even? exp)
      (remainder (square (expmod base (/ exp 2) m))
 m))
     (else
      (remainder (* base (expmod base (- exp 1) m))
 m))))
(define (fast-prime? n times)
(cond ((= times 0) true)
     ((fermat-test n) (fast-prime? n (- times 1)))
     (else false)))
(define (fermat-test n)
(define (try-it a)
   (= (expmod a n n) a))
      (try-it (+ 1 (random (- n 1)))))


1.25

(define (search-for-primes-25 start end count)
    (define (timed-prime-test n)
(newline)
        (display n)
(start-prime-test n (runtime)))
    (define (start-prime-test n start-time)
(if (fast-prime? n 10000)
   (report-prime (- (runtime) start-time))
   0))
    (define (report-prime elapsed-time)
(display " *** ")
        (display elapsed-time)
1)
    (define (search-iter start end count)
(if (or (> start end) (= count 0))
   0
   (if (= (timed-prime-test start) 1)
(search-iter (+ start 1) end (- count 1))
(search-iter (+ start 1) end count))))
    (search-iter start end count))
(define (expmod base exp m)
    (remainder (fast-expt base exp) m))
(define (fast-expt base exp)
(cond ((= exp 0) 1)
     ((even? exp)
      (square (fast-expt base (/ exp 2))))
     (else
      (* base (fast-expt base (- exp 1))))))
(define (fast-prime? n times)
(cond ((= times 0) true)
     ((fermat-test n) (fast-prime? n (- times 1)))
     (else false)))
(define (fermat-test n)
(define (try-it a)
   (= (expmod a n n) a))
      (try-it (+ 1 (random (- n 1)))))

Mac终端SSH连接腾讯云服务器保姆级教程(附秘钥管理技巧) 本文提供Mac终端SSH连接腾讯云服务器的详细教程,涵盖密钥生成、权限设置、连接优化及高级管理技巧。通过清晰的步骤和实用配置,帮助用户安全高效地管理远程服务器连接,特别适合开发者和运维人员参考。 阅读详情

相关推荐

OpenClaw Windows 最详细安装指南

Windows上养龙虾:OpenClaw完整安装教程+钉钉接入,助你养只大龙虾

weixin_43405859的博客 2211

SICP section 1.2

1.16(define (fast-expt b n) (fast-expt-iter b n 1)) (define (fast-expt-iter b n a) (cond ((= n 0) a) ((even? n) (fast-expt-iter (* b b) (/ n 2) a)) (else (fast-expt-iter b (- n 1) (* b a))))) 

zzljlu的专栏 1162

Python实现安居客新房数据抓取简易版

本文介绍使用Python爬取安居客新房楼盘数据的方法,重点针对三四线城市。通过分析移动端H5页面结构,采用滚动加载方式获取推荐楼盘列表(class="recomm-list"),从中提取楼盘ID并拼接详情页链接。代码展示了如何解析HTML标签获取楼盘名称、状态、价格、户型等基本信息,并处理图片URL。爬取过程涉及一个一级页面和两个二级页面,同时提到可能遇到的验证码问题将在后续处理。核心代码使用BeautifulSoup解析HTML,requests发送请求,并将数据存入MySQL数据库。

qq_37604998的博客 473

SICP 习题 (1.26) 解题总结

SCIP 习题1.26是对expmod过程的讨论。 我不知道这道题对你来说是否简单,我个人是觉得比较简单。 题目说的是一个叫Louis Reasoner的人将expmod 过程实现成下面这个样子:(define (expmod base exp m) (cond (( = exp 0) 1) ((even? exp) (remainder (* (expmod base (/ exp

keyboardOTA的专栏 3192

FPGA编译加速实战:6大可落地的Vivado优化策略

FPGA编译本质上是NP-hard约束满足问题求解,而非传统软件编译;Vivado作为时序驱动的硬件实现工具链,其耗时瓶颈集中在Implementation阶段的布局布线(PnR)与逻辑优化。理解这一原理,才能跳出‘加线程’‘升版本’等表面优化,转向精准时序约束、增量编译、物理锚点控制、IP配置精简等工程级干预。这些技术手段直接作用于Vivado的Tcl执行流与底层求解空间,显著压缩搜索范围、减少无效迭代——尤其适用于Zynq/UltraScale等中大型项目(LUT > 80K、多时钟域、DDR/PCIe

weixin_34226182的博客 413

Qt5+OSG实战:如何用osgQOpenGLWidget在窗口中加载3D模型(附完整代码)

本文详细解析了如何在Qt5中使用osgQOpenGLWidget加载和渲染3D模型,涵盖环境配置、核心架构、性能优化及高级技巧。通过实战案例和完整代码,帮助开发者实现工业级3D模型渲染,提升Qt与OSG的整合效率。

weixin_42741930的博客 263

SICP 习题 (1.23) 解题总结

SICP 习题 1.23要求改进smallest-deivisor过程,因为samllest-devisor过程从2开始一直检测所有小于“根号n”的数,查找最小的因数。其实在检测了2以后就可以不再检测4,6,8,10等偶数,直接检查3,5,7,9等数就好了。 这题比较简单,就是定义一个过程,不断生成下一个奇数就好了,过程如下:(define (next-candidate n) (if (=

keyboardOTA的专栏 2467

LIGGGHTS颗粒模拟入门:从DEM原理到工程实践

离散元法(DEM)是一种用于模拟颗粒物质行为的数值方法,其核心原理是通过计算每个颗粒的运动和相互作用来预测颗粒系统的宏观行为。该方法基于牛顿第二定律和接触力学模型,能够精确描述颗粒间的碰撞、摩擦和粘结等微观机制。在工程实践中,DEM技术为优化工业设备设计、预测材料流动和减少实验成本提供了重要价值。它广泛应用于制药造粒、矿石破碎、粉体输送和农业加工等领域,帮助工程师和研究人员深入理解颗粒系统的复杂动力学。LIGGGHTS作为一款基于LAMMPS的开源DEM软件,继承了其高效的并行计算架构,并针对颗粒模拟进行了

weixin_33979203的博客 415

SICP习题1.23解答

(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-divi...

weixin_30486037的博客 177

GD32F103 -- LIN从机通讯 -- 程序代码 (精简版)

注意!!!注意!!!这是GD32从机通讯!!!GD32!!!GD32!!!

晴朗luo的博客 2497

SAP项目中 Waterfall vs Agile 的深度对比分析背景:方法论的演进SAP项目实施方法论经历了显著的代际更替。早期以 ASAP(Accelerated SAP) 为代表,采用经典瀑

本文对比分析了SAP项目实施中瀑布模型(ASAP)与敏捷方法(SAP Activate)的核心差异。瀑布模型采用线性流程,需求固定但变更成本高;敏捷方法则通过迭代开发实现动态调整,强调最佳实践和用户持续参与。文章指出,SAP系统的复杂性使纯粹敏捷难以实施,需在标准化与定制化间取得平衡。最终建议根据项目特性选择方法论:稳定需求适用瀑布模型,变化频繁则推荐敏捷,而SAP Activate本质上是两者的结构化融合,代表未来趋势。关键在于匹配项目实际需求,而非盲目追随方法论潮流。

金牌架构师 344

SICP 习题解 第二章

计算机程序的构造和解释习题解答 Structure and Interpretation os Computer Programs Exercises Answer 第二章 构造数据抽象 练习2.17 (define last-pair-1 (lambda (input) (if (= (length input) 1) input ...

weixin_30299539的博客 324

手把手教你学Simulink--基于Simulink的开关磁阻电机电流斩波控制仿真建模

特点:定子和转子均由普通硅钢片叠压而成,没有永磁体或绕组在转子上。工作原理:利用转子旋转时不同位置的磁阻变化产生转矩。控制挑战:由于SRM的高度非线性和磁饱和效应,需要复杂的控制算法来优化性能。利用Simscape Electrical中的模块构建SRM的物理模型,配置参数如电阻、电感等。matlab深色版本% 添加SRM电机模块根据实际需求调整电机参数。通过上述步骤,我们简要介绍了如何基于Simulink进行开关磁阻电机的电流斩波控制仿真建模。

MHD0815的博客 304

SICP的一些练习题

SICP的一些练习题 1.3较大两个数之和 1 (define (MaxSum x y z) 2 (+ (cond ((or (> x y) (> x z)) x) 3 (else 0)) 4 (cond ((or (> y x) (> y z)) y) 5 ...

weixin_34304013的博客 204

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SICP 解题集¶

SICP 解题集

qha0731的专栏 1204

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SICP_2.30-2.32

1 #lang racket 2 ;;;;;;;;;;;;;;;;;;;;;;2.30 3 (define (square-tree tree) 4 (cond ((null? tree) '()) 5 ((not (pair? tree)) (square tree)) 6 (else (cons (square-tree (car ...

weixin_30898109的博客 153

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SICP 解题集

源网址:http://sicp.readthedocs.org/en/latest/# SICP 解题集 这个文档的目标是成为中文化的、完整的《计算机程序的构造和解释》一书的解题集。 这个解题集的特色是: 对于每道习题,除了习题答案之外,还给出习题的讲解和相关资料(如果有的话); 使用 MIT Scheme 作为编程环境,完全避免了代码不兼容的问题; 所有代

chinaliping的专栏 2261

SiCp/Al:一种轻质高强的先进复合材料

SiCp/Al(碳化硅颗粒增强铝基复合材料)是一种轻质高强的先进金属基复合材料,兼具铝合金的轻质韧性和碳化硅的高硬度高耐磨性。该材料具有优异的比强度、可定制的热膨胀系数、卓越的尺寸稳定性和耐磨性,广泛应用于航空航天、电子封装、汽车制造等领域。然而,其高硬度也带来加工难题,需要采用超声波振动、激光辅助等特殊加工技术。当前研究聚焦于制备工艺创新(如真空压力浸渗、增材制造等)、使役性能提升(尺寸稳定性、疲劳性能等)以及新型加工技术开发(超声振动辅助、激光辅助加工等),旨在实现材料性能与加工工艺的协同优化。

python_DONG的博客 289

SICP_3.26

1 (define false #f) 2 (define true #t) 3 4 (define (make-table) 5 (let ((local-table '())) 6 7 (define (make-tree key value left-branch right-branch) 8 (list (cons key v...

weixin_30278311的博客 82

SICP_2.21-2.23

1 #lang racket 2 3 ;;;;;;;;;;;;;;;;;;;2.21 4 (define (square-list items) 5 (if (null? items) 6 null 7 (cons (square (car items)) 8 (square-list (cdr items))...

weixin_30478923的博客 163

学习伯克利CS 61A课程(Structure and Interpretation of Computer Programs, SICP)的相关资源

有个叫做Teach Yourself Computer Science的网站[1]教如何自学计算机科学,关于Programming这个方向推荐了《Structure and Interpretation of Computer Programs, SICP》这本书(Peter Norvig在文章Teach Yourself Programming in Ten Years[12]中也提到这本书),...

Find your love 3663

【SICP练习】135 练习3.66

练习3-66原文Exercise 3.66. Examine the stream (pairs integers integers). Can you make any general comments about the order in which the pairs are placed into the stream? For example, about how many pairs

nomasp 3716

SICP_3.1-3.22

1 ;;;;;;;;;;;3.1 2 3 (define (make-accumulator base) 4 (lambda (num) 5 (set! base (+ base num)) 6 base)) 7 8 (define A (make-accumulator 5)) 9 10 (A 10) 11 (A 10) 12...

weixin_30325071的博客 128

SICP 1.6-1.8

1.6由于scheme应用序求值的性质,该函数会陷入循环(一直计算 improve guess x)1.7值过小,0.001这个精度远远不够...值过大,由于浮点数精度有限,(比如使用IEEE754浮点数标准, 32位浮点数表示123456789这样的数会有严重的精度丢失), 所以无法得出正确求两个较大的数的差. 1 (define (abs x) 2 (if (>= x 0...

weixin_30472035的博客 119
上一篇: SICP 1.21 1.22 体会
下一篇: SICP 1.27 1.28体会
levinjoe
博客等级 码龄25年 66粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值