练习2.17
;; 直接利用已经实现的list-ref和length过程即可
(define (last-pair items)
(if (null? items)
(display "null")
(list-ref items (- (length items) 1))))
练习2.18
;; 翻转即为将列表第二个元素翻转再加上第一个元素
(define (reverse items)
(if (null? items)
'()
(append (reverse (cdr items)) (list (car items)))))
;; 翻转即为倒序取列表值再组合成新的列表
(define (reverse items)
(define (reverse-iter a n)
(if (< n 0)
'()
(cons (list-ref a n) (reverse-iter a (- n 1)))))
(reverse-iter items (- (length items) 1)))
练习2.19
(define (no-more? coin-values)
(null? coin-values))
(define (except-first-denomination coin-values)
(cdr coin-values))
(define (first-denomination coin-values)
(car coin-values))
1 ]=> (cc 100 us-coins)
;Value: 292
1 ]=> (cc 100 (reverse us-coins))
;Value: 292
;; 改变coin-values的顺序不会影响结果
;; 因为在cc过程中递归的累加 只用某种币值的兑换种数和除去这种币值后的兑换种数, 因此和次数无关
练习2.20
;; 首先定义flag过程, 以判断传入的两个数是否奇偶性一致
;; 然后在get-list过程中递归使用cdr取列表的剩余部分完成奇偶性检查
;; 最后将参数拼接成列表调用get-list过程
(define (same-parity x . y)
(define (flag a b)
(= (remainder a 2) (remainder b 2)))
(define (get-list items)
(if (null? items)
'()
(if (flag x (car items))
(cons (car items) (get-list (cdr items)))
(get-list (cdr items)))))
(get-list (cons x y)))
1 ]=> (same-parity 1 2 3 4 5 6 7)
;Value : (1 3 5 7)
1 ]=> (same-parity 2 3 4 5 6 7)
;Value : (2 4 6)
1 ]=> (same-parity 2 2 0 128 6 7)
;Value : (2 2 0 128 6)
练习2.21
(define (square-list items)
(if (null? items)
'()
(cons (square (car items))
(square-list (cdr items)))))
(define (square-list items)
(map (lambda (x) (square x)) items))
练习2.22
;; Louis在组成新的结果时, 在cons的两个参数上搞反了
;; 调整之后因为对列表和数值直接结合导致出现如下结果
;Value : (((((() . 1) . 4) . 9) . 16) . 25)
;; 因此做如下修正, 将数值变换为列表然后再和之前的结果相加
(define (square-list items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(append answer
(list (square (car things)))))))
(iter items '()))
练习2.23
(define (for-each proc items)
(if (null? items)
'()
(and (proc (car items))
(for-each proc (cdr items)))))
分享到:
相关推荐
sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download>>>https://github.com/wizardforcel/sicp-py-zh
SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版
- **2.2.1 序列的表示**: 讨论序列数据结构的设计与实现。 - **2.2.2 层次结构**: 探讨层次数据结构的特点和优势。 - **2.2.3 作为传统接口的序列**: 讲解序列作为数据交互标准的重要性。 - **2.2.4 示例:图像...
- **列表**:SICP中常用的数据结构,用于存储和处理序列数据。列表可以是空的(nil或null),或者由一个元素和一个指向另一个列表的引用组成。 - **递归数据结构**:如树和图,可以通过递归定义来表示,这在处理...
总的来说,SICP 2.2.4节的图形语言不仅是学习Scheme或Racket编程的一个重要部分,更是对计算思维和编程艺术的一次深入探索。通过实践和理解这些概念,你将能更好地理解和创造计算世界中的视觉表现形式。
通过学习SICP,读者可以掌握如何用基本的构建块来构造复杂的计算系统,并理解这些系统的行为。书中的习题设计巧妙,旨在引导读者深入思考编程语言的内部机制以及如何设计和实现自己的编程环境。 《SICP解题集》中...
《SICP笔记和练习》是一份详尽的资源,主要涵盖了由MIT教授们编写的经典计算机科学教材《Structure and Interpretation of Computer Programs》(简称SICP)的学习笔记和练习解答。这份资料以HTML格式呈现,便于在线...
在Python中实现SICP的挑战在于,Python的语法和Lisp有很大区别,但这也为学习者提供了思考不同编程范式的机会。例如,Python的面向对象特性可以用来模拟SICP中的一些过程抽象,而Lisp中的动态作用域在Python中需要...
9. 序列和协程:序列作为一种数据结构,是存储和操作数据的基础。而协程作为一种程序执行的非抢占式子程序,允许程序员更加有效地控制程序的流程。本书第五章将介绍这些主题,并讲解如何将它们应用于实际问题中。 ...
SICP常常引导学生用列表来表示和操作数据,如列表的过滤、映射、折叠等高阶函数。1.22可能是一个关于列表处理的挑战,如实现一个函数,可以对列表进行特定的变换或者查找列表中的模式。 3. **1.28.ss**: 可能与环境...
SICP-Python版本
Python SICP epub版本,很适合学习抽象的思想,用Python版本比lisp更实用
SICP 使用的scheme解释器 以前叫DrScheme
- **序列表示 (Representing Sequences)**:介绍了一种用于表示序列的有效方法。 - **层次结构 (Hierarchical Structures)**:讲解了如何构建和操作层次数据结构。 以上是《结构与解释计算机程序》中的一些核心...
5. **控制结构和计算的表示**:书中详细分析了条件表达式、迭代和递归等控制结构,并探讨了如何用过程来模拟不同的计算模型,如图灵机和微处理器。 6. **对象和模拟**:通过引入面向对象的概念,SICP展示了如何用...
通过学习SICP,学生将能够理解如何设计、分析和实现复杂的程序系统,培养出强大的抽象思维能力。 课程内容涵盖了以下几个关键知识点: 1. **基本编程概念**:包括变量、数据结构(如列表、树)、控制结构(条件...
标题中的"PyPI 官网下载 | sicp-0.0.1b102.dev4.tar.gz"指的是从Python的官方包索引(Python Package Index,简称PyPI)上下载的一个名为"sicp"的软件包的版本号为0.0.1b102.dev4的压缩文件,其格式是tar.gz。...
1. **函数式编程**:SICP强调函数式编程风格,其中程序被看作是数学函数的组合,而不是指令的序列。这鼓励读者思考如何通过组合现有函数来解决问题,而不是通过改变状态。 2. **递归**:递归是SICP中的关键概念,...
SICP不仅在MIT内部被广泛用作教学材料,而且在全球范围内也享有极高的声誉,被视为学习计算机科学理论基础的必读之作。 #### 二、书籍内容概览 SICP的内容涵盖了程序设计的基本概念、过程抽象、数据抽象、模块化...