计算机程序的构造和解释习题解答

Structure and Interpretation os Computer Programs Exercises Answer

第二章 构造数据抽象

练习2.17

    (define last-pair-1
(lambda (input)
(if (= (length input) 1)
input
(last-pair-1 (cdr input)))))
;因为length的定义是递归定义的,所以如果是一个长列表,用length会非常耗时
;last-pair-2和last-pair-3用null?去检测列表是否为空,效率会更高
(define last-pair-2
(lambda (input)
(if (null? (cdr input))
input
(last-pair-2 (cdr input)))))
(define last-pair-3
(lambda (input)
(let ([last (cdr input)])
(if (null? last)
input
(last-pair-3 last)))))

练习2.18

    (define reverse-1
(lambda (input)
(if (null? input)
'()
(append (reverse-1 (cdr input)) (cons (car input) '())))))
;用迭代的方式效率更高
(define reverse-2
(lambda (input)
(define reverse-iter
(lambda (remain record)
(if (null? remain)
record
(reverse-iter (cdr remain) (cons (car remain) record)))))
(reverse-iter input '())))

练习2.19

理解换零钱的逻辑,将总数为a的现金换成n种硬币的不同方式等于:

  • 不考虑第一种硬币,将现金a换成除第一种硬币之外的所有其他硬币的不同方式数目,加上
  • 考虑第一种硬币,将现金a-v[0]换成所有种类的硬币的不同方式的数目。

所以表coin-values的排列顺序给结果没有关系,是否有序排列结果都是一样的。

    (define first-denomination
(lambda (coin-values)
(car coin-values)))
(define except-first-denomination
(lambda (coin-values)
(cdr coin-values)))
(define no-more?
(lambda (coin-values)
(if (null? coin-values)
#t
#f)))

练习2.21

    (define (square-list-1 items)
(if (null? items)
'()
(cons (* (car items) (car items)) (square-list-1 (cdr items)))))
(define (square-list-2 items)
(map (lambda (x) (* x x)) items))

练习2.22

(cons x y)的作用是把x当成一个元素插入到列表y的开头,如果x本身是一

个列表,x会以列表的身份插入到y开头。

比如(cons '(1) '(2 3))的结果不是'(1 2 3),而是'('(1) 2 3)。

此处可以使用append。

练习2.23

    (define (for-each-1 func items)
(if (null? items)
#f
(or (func (car items))
(for-each-1 func (cdr items))))) (define (for-each-1 func items)
(if (null? items)
#f
(or (func (car items))
(for-each-1 func (cdr items)))))

练习2.24

练习2.25

    (car (cdr (car (cdr (cdr '(1 3 (5 7 9)))))))
(car (car '((7))))
(car (cdr (car (cdr (car (cdr (car(cdr (car (cdr (car (cdr '(1 (2 (3 (4 (5 (6 7))))))))))))))))))

练习2.26

- (append x y): '(1 2 3 4 5 6)
- (cons x y): '((1 2 3) (4 5 6))
- (list x y): '((1 2 3) (4 5 6))

练习2.27

    (define (deep-reverse items)
(cond
[(null? items) (list)]
[(not (pair? (car items))) (append (deep-reverse (cdr items)) (list (car items)))]
[else (append (deep-reverse (cdr items)) (cons (deep-reverse (car items)) (list)))]))

练习2.28

    (define (fringe items)
(if (null? items)
'()
(if (pair? (car items))
(append (fringe (car items)) (fringe (cdr items)))
(cons (car items) (fringe (cdr items))))))

练习2.29

a)

    (define (left-branch bran)
(car bran))
(define (right-branch)
(car (cdr bran)))

练习2.30

1)不使用高阶函数,直接定义

    (define (square-tree items)
(if (null? items)
(list)
(if (not (pair? (car items)))
(cons (* (car items) (car items)) (square-tree (cdr items)))
(append (cons (square-tree (car items)) (list)) (square-tree (cdr items))))))

2)使用map

    (define (tree-map proc trees)
(if (null? trees)
(list)
(if (not (pair? (car trees)))
(cons (proc (car trees)) (tree-map proc (cdr trees)))
(append (cons (tree-map proc (car trees)) (list)) (tree-map proc (cdr trees))))))

练习2.31

答案同2.30

练习2.32

练习2.33

    (define (map p sequence)
(accumulate (lambda (x y) (p x)) '() sequence))
(define (append seq1 seq2)
(accumulate cons seq2 seq1))
(define (length sequence)
(accumulate (lambda (x y) (+ y 1)) 0 sequence))

练习2.34

    (define (horner-eval x coefficient-sequence)
(accumulate (lambda (this-coeff higher-terms) (+ this-coeff (* x higher-terms)))
0
coefficient-sequence))

练习2.35

练习2.36

    (define (first-elems items)
(if (null? items)
(list)
(cons (car (car items)) (first-elems (cdr items)))))
(define (rest-elems items)
(if (null? items)
(list)
(cons (cdr (car items)) (rest-elems (cdr items)))))
(define (accumulate-n op init seqs)
(if (null? (car seqs))
(list)
(cons (accumulate op init (first-elems seqs))
(accumulate-n op init (rest-elems seqs)))))

SICP 习题解 第二章的更多相关文章

  1. 《C++Primer》第五版习题答案--第二章【学习笔记】

    C++Primer第五版习题解答---第二章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/9 第二章:变量和基本类型 练习2.1: 类 ...

  2. C程序设计语言(第二版)习题:第二章

    这一章习题做着很舒服,毕竟很简单.所以很有感觉. 练习 2-1 Write a program to determine the ranges of char , short , int , and ...

  3. VC++深入详解-第二章学习心得

    由于之前看过C++的一些知识,所以这一章就挑一点以前比较不太在意的进行记录 首先是虚函数,纯虚函数 虚函数用关键字virtual申明,我理解成为派生类提供覆盖 纯虚函数virtual xxx()=xx ...

  4. 《CSS权威指南》双鱼书详解——第二章选择器

    一.基本规则 CSS的核心特性就是能向文档中的一组元素类型应用某些规则. 二.规则结构 选择器+声明块. h1{ color:red;background:yellow;} ,声明块由一个或多个声明组 ...

  5. Java程序设计(2021春)——第二章课后题(选择题+编程题)答案与详解

    Java程序设计(2021春)--第二章课后题(选择题+编程题)答案与详解 目录 Java程序设计(2021春)--第二章课后题(选择题+编程题)答案与详解 第二章选择题 2.1 面向对象方法的特性 ...

  6. 统计学习导论:基于R应用——第二章习题

    目前在看统计学习导论:基于R应用,觉得这本书非常适合入门,打算把课后习题全部做一遍,记录在此博客中. 第二章习题 1. (a) 当样本量n非常大,预测变量数p很小时,这样容易欠拟合,所以一个光滑度更高 ...

  7. Python编程快速上手-让繁琐工作自动化-第二章习题及其答案

    Python编程快速上手-让繁琐工作自动化-第二章习题及其答案 1.布尔数据类型的两个值是什么?如何拼写? 答:True和False,使用大写的T和大写的F,其他字母是小写. 2.3个布尔操作符是什么 ...

  8. C语言程序设计:现代方法(第2版)第二章全部习题答案

    前言 本人在通过<C语言程序设计:现代方法(第2版)>自学C语言时,发现国内并没有该书完整的课后习题答案,所以就想把自己在学习过程中所做出的答案分享出来,以供大家参考.这些答案是本人自己解 ...

  9. 第二章 IP协议详解

    第二章 IP协议详解 2.1 IP服务的特点 它为上层协议提供了无状态,无连接,不可靠的服务 名称 简介 优点 缺点 对付缺点的方法 无状态 IP通信双方不同步传输数据的状态信息 无须为保持通信的状态 ...

随机推荐

  1. 《SQL Server 2012 T-SQL基础》读书笔记 - 5.表表达式

    Chapter 5 Table Expressions 一个表表达式(table expression)是一个命名的查询表达式,代表一个有效的关系表.SQL Server包括4种表表达式:派生表(de ...

  2. win7x64 串口程序无法运行,提示:component 'MSCOMM32.OCX' or one of its dependencies not correctlu registered。。。

    VB写的串口工具在win7 x64机器运行时遇到的问题, component 'MSCOMM32.OCX' or one of its dependencies not correctlu regis ...

  3. bash如何向上向下移动历史命令记录

    bash如何在 历史命令记录 中上下移动? 通过bash本身的设置,就可以做到! : 用shift+up , shift+down 来上下移动 : 单纯的up/down是调用历史命令

  4. Docker - 部署 Ant Design Pro 的项目

    解读 Ant Design Pro 的 Docker 配置 package.json 的 scripts -f: 使用什么配置文件 -t: 标签 up: 启动服务(的容器) build: 构建或重新构 ...

  5. linux文本图形界面转换

    vim /etc/inittab 3为默认进入文本界面, 5为默认进入图形界面 文本界面下输入init5或者startx切换图形化界面  图形化界面下输入init3切换文本界面

  6. Delphi XE2 之 FireMonkey 入门(18) - TLang(多语言切换的实现)

    一个小小的 TLang 类, 实现多语言切换, 挺好的. 它的工作思路是: 1.首先通过 AddLang('语言代码') 添加语言类别, 如: AddLang('en').AddLang('cn'). ...

  7. 测开之路八十八:HTML之文本格式化

    准备一段文本内容 强调显示: <!-- b标签,加粗显示 --> <p><b>这是b标签的效果</b></p> <!-- strong ...

  8. fiddler之简单的接口性能测试

    在针对某一个/某一些接口,发送相同的请求,不考虑参数的变化时,可以使用fiddler进行简单的性能测试.(使用功能为:replay) 一.replay功能调用 (1.Reissue Requests: ...

  9. 介绍一款代理端口管理工具--Proxfier

    官网下载地址: https://www.proxifier.com/download/ProxifierSetup.exe 用户名随意填注册码下边 5EZ8G-C3WL5-B56YG-SCXM9-6Q ...

  10. IDEA常用快揵键

    IDEA常用快揵键 工作中常用IDEA快捷键 参见博客:https://www.cnblogs.com/zhangpengshou/p/5366413.html Double shift    --- ...