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

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. UE4 质心相关

    Add force 始终给质心施加力,即使手动偏移了质心(Center of mass)也不例外. Add force at location local 相对于物体的原始质心位置增加一个偏移值后的位 ...

  2. E. Compress Words

    E. Compress Words KMP #include<bits/stdc++.h> using namespace std; ]; int len; void getNext(ch ...

  3. Spring MVC Captcha 验证码

    本文专为不想一遍遍手写验证码代码的”懒猿“而生,只需要添加部分配置文件,拷贝一个控制层代码,就能在页面中方便使用.话不多说,进入主题: 一. Spring MVC 环境实现方式: 1.1 spring ...

  4. 大数据笔记(十七)——Pig的安装及环境配置、数据模型

    一.Pig简介和Pig的安装配置 1.最早是由Yahoo开发,后来给了Apache 2.支持语言:PigLatin 类似SQL 3.翻译器 PigLatin ---> MapReduce(Spa ...

  5. Windows XP SP2上安装.net 4

    1.安装 KB893803-v2-x86 2.安装dotnetfx35 3.安装dotNetFx40_Client_x86_x64 4.安装 NET Framework 4.0

  6. url传输中+转为%2B取到变空格的问题

    一个加密串,通过url传过来后怎么也解密不了. 原串: h1tQYMmnx7jdvowi9KnaEM5dHfamJ+rbaRnvhwhUmRAvyxpA2AGzszx5k9K0qdhiQUq7m42S ...

  7. p5437 【XR-2】约定

    分析 https://www.cnblogs.com/cjyyb/p/11111404.html 代码 #include<bits/stdc++.h> using namespace st ...

  8. 在Linux环境中运行python 项目

    1首先创建一个虚拟环境或者在一个已有的虚拟环境中创建一个django项目 1.1 创建一个虚拟环境: mkvirtualenv my_django115 这会在 ~/Envs 中创建 my_djang ...

  9. C# Oledb 连接Access数据库字符串

    string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbFile + ";Persist ...

  10. Collector 源码分析

    Collectors Collectors 配合 stream 可以实现 MapReduce 操作,也可以单独完成流中元素的收集. 收集器接口和实现 /** * 收集器接口 */ public int ...