sicp 习题 2.21 ~ 2.25

2.21

(define nil '())

(define (square x)
(* x x))

(define (square-list items)
(if (null? items)
nil
(cons (square (car items)) (square-list (cdr items)))))

(define (square-list-map items)
(map (lambda (x) (square x)) items))

(square-list (list 1 2 3 4))

(square-list-map (list 1 2 3 4))


2.22

(define nil '())
(define (square x)
(* x x))

(define (square-list-iter items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(cons (square (car things))
answer))))
(iter items nil))

(define (square-list items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(cons answer
(square (car things))))))
(iter items nil))

(square-list-iter (list 1 2 3 4))
(square-list (list 1 2 3 4))


2.23

(define nil '())

(define (my-for-each proc items)
(if (not (null? items))
((lambda() (proc (car items))
(my-for-each proc (cdr items))))))

(my-for-each (lambda (x) (newline) (display x))
(list 57 321 88))


2.24

(list 1 (list 2 (list 3 4)))


2.25

(define x1 (list 1 3 (list 5 7) 9))

(define x2 (list (list 7)))

(define x3 (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7)))))))

(car (cdr (car (cdr (cdr x1)))))

(car (car x2))

(car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr x3))))))))))))
SICP 习题 (2.21)解题总结: map的使用 SICP 习题 2.21 开始引入了map,准确来讲,是这道题目前的文章内容开始引入了map。为了完成本习题,甚至说为了完成本文以后的阅读,请读者一定要理解清楚map的概念,正如书中所说,“map是一种很重要的结构,不仅因为它代表了一种公共模式,而且因为它建立起了一种处理表的高层抽象”。虽然说得非常高大上,但是map的概念理解起来并不困难,最基本的理解就是给你一组东西,你对这组东西执行map操作的 阅读详情

相关推荐

SICP 习题 (2.18) 解题总结:反转列表

SICP 习题 2.18 要求我们定义一个过程名叫reverse,可以将一个list反转过来。比如 (reverse (list 1 4 9 16 25)) 的结果是:(25 16 9 4 1)这道题和之前的2.17有相似之处,都是对list进行遍历,然后做相应处理。不过2.17比较简单,遍历到最后面返回最后的元素就好了,2.18复杂一点,需要在遍历之后将list元素反向组装起来。我们可以按以前的

keyboardOTA的专栏 3465

SICP 习题 (2.25)解题总结:列表的操作

SICP 习题 2.25 简单到不用解释题目要求我们使用car和cdr操作获得以下列表中的7:'(1 3 (5 7) 9) '((7)) '(1 (2 (3 (4 (5 (6 7))))))各位同学搞清楚car和cdr就可以简单完成了,代码如下:(define (start-test-2-25) (display (car (cdr (car (cdr (cdr '(1 3 (5 7) 9))

keyboardOTA的专栏 2024

SICP 习题 (2.11)解题总结:区间乘法的优化

SICP 习题 2.11又出现Ben这个人了,如以前说到的,只要是Ben说的一般都是对的。来看看Ben说什么,他说:“通过监测区间的端点,有可能将mul-interval分解为9中情况,每种情况中所需要的乘法都不超过两次”。所以这个叫Ben的人建议Allysa重写mul-interval过程。到底是啥意思呢,我们先来看看以前的mul-interval过程:(define (mul-interval

keyboardOTA的专栏 5万+

深入理解计算机系统 练习题2.21 答案与分析

先上结果 先记住一个值2322322^{32}为4294967296,后面计算都基于这个值,因为是32位机器 表达式 类型 求值 -2147483647-1==2147483648U 无符号 1 -2147483647-1<2147482647 有符号 1 -2147483647-1U < 2147483647 无符号...

ciqingloveless的博客 2706

SICP 习题 (2.19) 解题总结:重写零钱兑换程序

SICP 习题2.19 要求我们重新设计1.2.2节的零钱兑换程序,要求我们可以轻易改变程序里用的兑换币种。我们先看看1.2.2节的零钱兑换程序,代码是这样的:(define (RMB-Change amount) (format #t "Changing ~S~%" amount) (cond ((= amount 0) 0) ((< amount 0) 0) (else (RMB-

keyboardOTA的专栏 2978

SICP 习题 (1.31)解题总结

SICP 习题1.31开始拔高我们的抽象能力,向更高的高度进发,以更好地理解高阶函数。习题1.31是基于1.30的。在习题1.30中我们定义了累加的过程sum,其实我们可以发现,这种累积操作是可以做更高的抽象的。在做更高的抽象之前让我们看看使用乘法做累积的代码是什么样的,这就是题目要求我们完成的第一个任务,做函数值的乘积。定义出来的过程如下:(define (product term a next

keyboardOTA的专栏 3349

【SICP练习】92 练习2.65

练习2.65 最后一道题了,来个总结倒是很不错。要完成两个函数,我们就要用到前面所学,首先用练习2.63中的函数将树变成表,这样有利于后续的处理,而根据前面的习题,用tree->list-2会更加快速。然后要实现并集或补集的功能,也要用到第104页相关的函数。题目要求的是平衡二叉树,因此还要用到练习2.64中的list->...

weixin_33811539的博客 142

SICP 习题 (1.19) 解题总结

SICP习题1.19要求用对数步数求斐波那契数,有关斐波那契数我们在习题1.13 中讨论过,书中1.2.2节也详细讲解了斐波那契数的求法。在1.2.2节中讲述了斐波那契数的递归求法和迭代求法,其中递归求法的步数为Fib(n),而迭代求法的步数相对于n是线性的。虽然迭代求法的步数已经很少了,但是我们可以通过一种方法将步数减少为对数步数,其中的关键就是前面习题中提到的,将两个连续变换转换成一次变换的方

keyboardOTA的专栏 4697

《SICP》习题第2章

本人做的SICP习题第2章,如有错误请指正,用的解释器是Racket   练习2.1 ;; Exercise 2.1 ;; 有理数 #lang racket ;; 有理数定义 (define (numer x) (car x)) (define (demon x) (cdr x)) ;; 处理分子分母均为正的有理数 (define (make-positive-rat n d) (l...

四毛毛的博客 1693

SICP 习题 (2.13)解题总结:区间计算误差

SICP 习题 2.13 又像是一道数学证明题,和编程关系不大,不过这不能阻挡我们去完成它。题目要求我们证明,当误差百分比很小的时候,可以使用一个简单的公式,根据被乘区间的误差去计算乘积的误差。同时,为了简化问题,题目允许我们只计算所有数为正的情况,因为涉及到负数时,乘积的正负变化比较多样,不容易统一处理。我看到题目后最直接的反应不是去证明它,而是通过程序去找到这个简单的公式,典型的程序员心理。要

keyboardOTA的专栏 3万+

SICP 习题 (1.14)解题总结

SICP 习题 1.14要求计算出过程count-change的增长阶。count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程。要解答习题1.14,首先你需要理解count-change的工作方式,要理解count-change的工作方式,最好是自己去实现一遍count-change,为了避免自己直接抄书中的代码,我决定自己实现一遍用来找换人民币的的“count-change”

keyboardOTA的专栏 6843

SICP 习题 (1.25) 解题总结

SICP 习题 1.25 就是我上面说过的伤自尊的题了。 习题1.25说到有个叫Allyssa P. Hacker的人说expmod过程完全没有必要搞那么麻烦,直接使用前面的fast-expt过程和remainder过程就好了,她(叫Alyssa的应该是女的吧)觉得可以这样定义expmod:(define (expmod base exp m) (remainder (fast-expt bas

keyboardOTA的专栏 3641

SICP 习题 (2.22)解题总结: 迭代过程中的列表处理

SICP 习题 2.22是习题2.21的后续题目,题目中讲到叫Louis Reasoner的人想重写suqare-list过程,希望使用迭代计算过程,而不是递归计算过程,有关迭代计算过程和递归计算过程,如果你没什么印象了,请翻回习题1.9 的解题总结看看。那个叫Louis Reasoner的人写的迭代版的suqre-list是这样的:(define (square-list-revert item

keyboardOTA的专栏 3105

SICP 习题 (1.21) 解题总结

SICP 习题1.21要求用书中的smallest-divisor过程找出199, 1999, 19999的最小因子。这道题是个纯复习题,没有新知识,也没有什么难度。为了方便,将书中的smallest-divisor过程列出如下:(define (smallest-divisor n)  (find-divisor n 2))(define (find-divisor n test-divisor

keyboardOTA的专栏 2149

SICP 习题 (1.33)解题总结

SICP 习题 1.33将之前抽象的accumulate过程继续往上拔,要求我们定义一个带过滤器的accumulate过程,在这个过程中加多一个参数,这个参数是另一个过程,用来做过滤器。比如我们调用(filtered-accumulate 奇数?+ 0 my-self 1 next-int 100)就是列出1到100的数,对每个数调用(奇数? n),如果结果为真就将这个数加入到累积结果中,如果结果

keyboardOTA的专栏 4465

2025年普通人转向人工智能运维(AIOps)学习建议(附最新技术实践与资源)

AIOps不仅是技术的叠加,更是运维流程的重构。建议通过“学习-实践-反馈”循环,逐步从工具使用者成长为解决方案设计者。如需完整资源链接,可访问上述推荐的优快云博客及GitHub仓库。

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 3096

SICP 习题 (1.18) 解题总结

SICP 习题 1.18是习题1.17的扩展,要求我们将1.17题中的对数步数求加法的过程修改成迭代方式。同时,习题1.18习题也是对习题1.16的强调,习题1.16是通过迭代方法求幂,这里是通过迭代方法求加法。 所以我们需要回过头去看习题1.16和1.17。习题1.16是将以下函数进行修改:(define (fast-expt b n) (cond ((= n 0) 1) ((even?

keyboardOTA的专栏 4429

ROS水下仿真神器uuv_simulator:从零搭建水下机器人测试环境(附Gazebo配置全流程)

本文详细介绍了如何使用ROS和uuv_simulator从零搭建水下机器人仿真测试环境,包括Gazebo配置全流程。通过系统环境准备、水下世界构建、机器人模型定制开发等步骤,帮助开发者在虚拟海洋环境中高效验证算法,大幅降低研发成本。特别适合水下机器人研发人员参考。

ujm5678901的博客 263

SICP 习题 (1.36)解题总结

SICP 习题 1.36 要求我们修改fixed-point函数,使它能够打印出计算中产生的近似值序列,使用练习1.22展示的newline和display方法。而后通过找出变换x => log (1000)/log(x)的不动点的方式确定x^x=1000的一个根(书中还提示你使用Scheme的基本过程log,用于计算自然对数值)。然后比较一下使用平均阻尼和不用平均阻尼的计算步数。要注意的是不能使

keyboardOTA的专栏 4073

非线性动力学_用MatCont分析非线性动力学方程组(一)

写在前面:笔者打算写两到三篇系列文章介绍MatCont,此为第一篇《用MatCont分析非线性动力学方程组(一)》。MatCont是一个基于Matlab而开发的免费工具包,专门用来做非线性动力学模型分叉、向量场、周期性等分析,符号(连续性)运算和数值(离散性)运算均适用。该工具的开发及研究项目由比利时Ghent大学的Willy Govaerts教授、荷兰Utrecht大学的Yuri Kuznets...

weixin_39700215的博客 2769

Nangate 45nm FreePDK开源工艺库:从RTL到GDSII全流程实战

在数字IC设计中,标准单元库是连接逻辑综合与物理实现的基石,它定义了每个单元的逻辑功能、时序延迟与物理尺寸。开源EDA工具链的成熟,使得个人也能借助免费工艺套件完整跑通芯片设计流程。Nangate 45nm FreePDK作为一套经典的开源工艺库,凭借结构清晰、配套完善的特性,成为学习数字后端和时序收敛的理想训练场。从综合工具Yosys读取Liberty文件进行逻辑映射,到OpenROAD执行布局布线与时钟树综合,再到使用OpenSTA分析关键路径延迟,这套流程涵盖了数字设计最核心的环节。通过亲手操作,开发

weixin_29168393的博客 277

SICP 习题 (2.5) 解题总结:复合数据的指数表示

SICP 习题 2.5 有点像是道数学题,首先要求我们证明可以将a和b的序对表示为2^a * 3^b,然后通过非负整数和算术运算表示序对。最后要求我们实现对应的cons, car 和cdr过程。这道题的根本就是复合数据的构成方式和解析方式。其实,对于所有复合数据来讲,我们都在处理同样一件事情,就是如何把复合数据的组成部分构建在一起,同时可以通过特定的方法将它们拆解出来。就好像我们要存放乒乓球和网球

keyboardOTA的专栏 4836

机器人视觉实战:用OpenCV搞定手眼标定(附完整C++代码)

本文详细介绍了使用OpenCV实现机器人视觉中的手眼标定技术,包括核心算法、工业场景优化及完整C++代码示例。通过解析坐标系转换问题,提供从数据采集到标定验证的全流程解决方案,帮助开发者在复杂工业环境中实现高精度机械臂与视觉系统的协同作业。

weixin_29306571的博客 481
上一篇: sicp 习题 2.17 ~ 2.20
下一篇: sicp 习题 2.26 ~ 2.30
柠乐_123
博客等级 码龄20年 19粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值