- 浏览: 222008 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
andy1015:
请教下楼主rtx问题 ,可以么
用HttpClient实现同步RTX -
cgp17:
请教:Chukwa支持Push数据吗?目前看到的都是Polli ...
基于Hadoo的日志收集框架---Chukwa的源码分析(适配器、代理) -
jimmee:
尼玛, 现在iteye的质量下降到何种水准了.
Mahout协同过滤框架Taste的源码分析 -
aubdiy:
aubdiy 写道我擦。。。。 这你叫分析才看到, 还有个 “ ...
Mahout协同过滤框架Taste的源码分析 -
aubdiy:
我擦。。。。 这你叫分析
Mahout协同过滤框架Taste的源码分析
练习2.33
;; map过程即为使用过程p作用x, 然后再合并作用y后的结果 (define (map p sequence) (accumulate (lambda (x y) (cons (p x) y)) '() sequence)) ;; append过程为合并两个列表, 则初始值为空表, 要传入的列表为枚举两个参数列表的元素组成的列表 (define (append seq1 seq2) (accumulate cons '() (enumerate-tree (list seq1 seq2)))) ;; length过程即为在y参数不为空时将长度递增 (define (length sequence) (accumulate (lambda (x y) (+ 1 y)) 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
(define (count-leaves tree) (accumulate + 0 (map (lambda (x) 1) (enumerate-tree tree))))
练习2.36
;; 这里关键是从序列的序列中依次取第一个、第二个、第N个元素 ;; 则应首先枚举序列中的每个序列, 检测非空, 分别取首元素 ;; 即(map car (filter pair? seqs)) (define (accumulate-n op init seqs) (if (null? (car seqs)) '() (cons (accumulate op init (map car (filter pair? seqs))) (accumulate-n op init (map cdr (filter pair? seqs))))))
练习2.37
;; 首先定义扩充的map,可以接收多个序列参数 (define (new-map proc item1 item2) (define items (list item1 item2)) (accumulate-n proc 1 items)) (define (dot-product v w) (accumulate + 0 (new-map * v w))) ;; 矩阵与向量的乘法即为矩阵中的每一行与向量做dot-product (define (matrix-*-vector m v) (map (lambda (w) (dot-product v w)) m)) ;; 矩阵转置即为分别取矩阵相同行的相同列组成新的行 (define (transpose mat) (accumulate-n cons '() mat)) ;; 矩阵乘法即为第一个矩阵的转置与第二个矩阵中的每一行做matrix-*-vector (define (matrix-*-matrix m n) (let ((cols (transpose n))) (map (lambda (w) (matrix-*-vector cols w)) m)))
练习2.38
(define (fold-right op initial sequence) (define (iter result rest) (if (null? rest) result (op (car rest) (iter result (cdr rest))))) (iter initial sequence)) 1 ]=> (fold-right / 1 (list 1 2 3)) ;Value: 3/2 1 ]=> (fold-left / 1 (list 1 2 3)) ;Value: 1/6 1 ]=> (fold-right list '() (list 1 2 3)) ;Value : (1 (2 (3 ()))) 1 ]=> (fold-left list '() (list 1 2 3)) ;Value : (((() 1) 2) 3) ;; 因为这两种方式的不同之处在于对结果的累加方式,因为如果对于op,如果满足交换律则两种方式处理的结果相同 1 ]=> (fold-right + 0 (list 1 2 3 4)) ;Value: 10 1 ]=> (fold-left + 0 (list 1 2 3 4)) ;Value: 10 1 ]=> (fold-right * 1 (list 1 2 3 4)) ;Value: 24 1 ]=> (fold-left * 1 (list 1 2 3 4)) ;Value: 24
练习2.39
(define (reverse sequence) (fold-right (lambda (x y) (append y (list x))) '() sequence)) (define (reverse sequence) (fold-left (lambda (x y) (append (list y) x)) '() sequence))
练习2.40
(define (unique-pairs n) (flatmap (lambda (i) (map (lambda (j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 n))) (define (prime-sum-pairs n) (map make-pair-sum (filter prime-sum? (unique-pairs n))))
练习2.41
;; 构建三元组即为在二元组的基础上进行组合 ;; 如n为6的三元组即为6与5的二元组的组合 ;; 即 (cons i (unique-pairs (- i 1)) (define (unique-pairs-new n) (flatmap (lambda (i) (map (lambda (j) (cons i j)) (unique-pairs (- i 1)))) (enumerate-interval 1 n))) 1 ]=> (unique-pairs-new 6) ;Value : ((3 2 1) (4 2 1) (4 3 1) (4 3 2) (5 2 1) (5 3 1) (5 3 2) (5 4 1) (5 4 2) (5 4 3) (6 2 1) (6 3 1) (6 3 2) (6 4 1) (6 4 2) (6 4 3) (6 5 1) (6 5 2) (6 5 3) (6 5 4)) ;; 过滤三元组的过程 (define (s-sum-pairs n) (filter s-sum? (unique-pairs-new n))) (define S 8) (define (s-sum? pair) (= S (accumulate + 0 pair))) 1 ]=> (s-sum-pairs 6) ;Value : ((4 3 1) (5 2 1))
练习2.42
;; 首先定义棋盘 ;; 构造棋盘的一列 (define (matrix-seqs seqs i n) (if (< i n) (matrix-seqs (cons 0 seqs) (+ i 1) n) seqs)) ;; 在已有的棋盘上追加n列 (define (matrix-iter matrix i n) (if (< i n) (matrix-iter (cons (matrix-seqs '() 0 n) matrix) (+ i 1) n) matrix)) ;; 构造n阶棋盘 (define (matrix-n n) (matrix-iter '() 0 n)) 1 ]=> (matrix-n 4) ;Value : ((0 0 0 0) (0 0 0 0) (0 0 0 0) (0 0 0 0)) ;; 然后构造在已有格局的基础上追加一列的过程 ;; 以4阶棋盘为例 ;; 0 0 0 0 ;; 1 0 0 0 ;; 0 0 0 0 ;; 0 1 0 0 ;; 此时有n=4, k=3 ;; 则新的格局应为(已经安全的前k-1列 + 需要循环检测每行安全性的第k列 + 暂时为空值的后(n-k)列 ;; 构造为空值的后(n-k)列 (define (cdr-rest n k) (if (= k n) '() (cons (matrix-seqs '() 0 n) (cdr-rest n (+ k 1))))) ;; 构造需要检测的第k列, 其中第row行的值设为1 (define (make-rest n row) (define x (- (+ n 1) row)) (define (rest-iter seqs i) (if (> i n) seqs (if (= i x) (rest-iter (cons 1 seqs) (+ i 1)) (rest-iter (cons 0 seqs) (+ i 1))))) (rest-iter '() 1)) ;; 将三者组合在一起构造出新的格局 (define (adjoin-position n row k rest) (define cdr-postion (cons (make-rest n row) (cdr-rest n k))) (define x (- k 1)) (define (iter i result) (if (> i 0) (iter (- i 1) (cons (list-ref rest (- i 1)) result)) result)) (iter x cdr-postion)) 1 ]=> rest ;Value : ((0 1 0 0) (0 0 0 1) (1 0 0 0) (0 0 0 0)) 1 ]=> (adjoin-position 4 1 4 rest) ;Value : ((0 1 0 0) (0 0 0 1) (1 0 0 0) (1 0 0 0)) 1 ]=> (adjoin-position 4 4 4 rest) ;Value : ((0 1 0 0) (0 0 0 1) (1 0 0 0) (0 0 0 1)) ;; 最后完成安全性的检测 ;; 在一列中查找皇后所在的行数 (define (find i seqs) (if (= (list-ref seqs (- i 1)) 1) i (find (+ i 1) seqs))) ;; 根据新格局中新添加的皇后的位置与已有的皇后位置进行冲突检测 (define (safe? n k positions) (define seqs-k (list-ref positions (- k 1))) (define row-k (find 1 seqs-k)) (define (iter i) (define seqs-i (list-ref positions (- i 1))) (define row-i (find 1 seqs-i)) (if (= i k) #t (if (= row-i row-k) ;; 相同行 #f (if (or (= (+ i row-i) (+ k row-k)) (= (- i row-i) (- k row-k))) ;; 对角线 #f (iter (+ i 1)))))) (iter 1)) ;; 因此可以使用如下过程进行求解 (define (queens board-size) (define empty-board (matrix-n board-size)) (define (queen-cols k) (if (= k 0) (list empty-board) (filter (lambda (positions) (safe? board-size k positions)) (flatmap (lambda (rest-of-queens) (map (lambda (new-row) (adjoin-position board-size new-row k rest-of-queens)) (enumerate-interval 1 board-size))) (queen-cols (- k 1)))))) (queen-cols board-size)) 1 ]=> (queens 4) ;Value : (((0 1 0 0) (0 0 0 1) (1 0 0 0) (0 0 1 0)) ((0 0 1 0) (1 0 0 0) (0 0 0 1) (0 1 0 0))) ;; 这里序列中的序列代表的是棋盘中的一列, 转换后即为 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0
练习2.43
;; 交换前 ;; 求解(queen n)时会递归调用(queen-cols n) ;; 直到k=0,得到n阶空棋盘 ;; 然后在第一列的第i行添加皇后作为新的格局, 共n种格局, 保留通过安全检测的格局 ;; 然后依次处理第i列, 共n列 ;; 所以这里共调用queen-cols过程n次 ;; 交换后 ;; 求解(queen n)时会递归调用(queen-cols n) ;; 而(queen-cols n)过程将递归调用嵌套在了嵌套映射中 ;; 因此queen-cols将会被调用n^n次 ;; 所以Louis的方法将会是原来的N^(N-1)倍
发表评论
-
SICP学习笔记 2.3.2 实例:符号求导
2012-12-12 09:59 1370练习2.56 (define (deriv ... -
SICP学习笔记 2.2.4 实例:一个图形语言
2012-12-11 21:49 1359练习2.44 (define (up-spl ... -
SICP学习笔记 2.2.2 层次性结构
2012-09-05 15:54 1289练习2.24 ;; 嵌套结构的list 1 ... -
SICP学习笔记 2.2.1 序列的表示
2012-08-31 17:31 1226练习2.17 ;; 直接利用已经实现的lis ... -
SICP学习笔记 2.1.4 扩展练习:区间算术
2012-08-28 17:12 1385练习2.7 ;; 抽象对象"区间& ... -
SICP学习笔记 2.1.3 数据意味着什么
2012-08-26 11:07 1145练习2.4 (define (new-con ... -
SICP学习笔记 2.1.2 抽象屏障
2012-08-18 22:05 929练习2.2 (define (make-poin ... -
SICP学习笔记 2.1.1 实例: 有理数的算术运算
2012-08-18 21:44 918练习 2.1 (define (make-r ... -
SICP学习笔记 1.3.4 过程作为返回值
2012-08-12 11:44 1035练习 1.40 (define (cubic ... -
SICP学习笔记 1.3.3 过程作为一般性的方法
2012-08-12 11:38 913练习 1.35 φ^2 = φ+1 == ... -
SICP学习笔记 1.3.2 用lambda构造过程
2012-07-13 08:50 801练习 1.34 > (d ... -
SICP学习笔记 1.3.1 过程作为参数
2012-07-13 08:44 976练习1.29 (define (sum ... -
SICP学习笔记 1.2.6 实例:素数检测
2012-06-04 11:08 1087练习1.22 ;; runtime函数在stk、ra ... -
SICP学习笔记 1.2.5 最大公约数
2012-05-17 17:35 867练习 1.20 (define (gcd a ... -
SICP学习笔记 1.2.4 求幂
2012-05-11 18:03 927练习1.16 根 ... -
SICP学习笔记 1.2.3 增长的阶
2012-05-09 21:06 1515练习1.14 (define (count-chan ... -
SICP学习笔记 1.1.7 实例:使用牛顿法求平方根
2012-04-25 18:02 1340练习1.6 应用序会对 (def ... -
SICP学习笔记 1.2.2 树形递归
2012-04-25 18:18 961练习1.11 递归过程 (defin ... -
SICP学习笔记 1.2.1 线性的递归和迭代
2012-04-24 17:22 892练习1.9 对于过程 (define ... -
SICP学习笔记 1.1.6 条件表达式和谓词
2012-04-24 17:18 861练习1.1 10 12 8 3 6 ...
相关推荐
9. 序列和协程:序列作为一种数据结构,是存储和操作数据的基础。而协程作为一种程序执行的非抢占式子程序,允许程序员更加有效地控制程序的流程。本书第五章将介绍这些主题,并讲解如何将它们应用于实际问题中。 ...
- **2.2.3 作为传统接口的序列**: 讲解序列作为数据交互标准的重要性。 - **2.2.4 示例:图像语言**: 通过图形化语言的例子进一步理解层次数据结构的应用。 #### 三、总结 《SICP》不仅是一本教科书,更是计算机...
总的来说,SICP 2.2.4节的图形语言不仅是学习Scheme或Racket编程的一个重要部分,更是对计算思维和编程艺术的一次深入探索。通过实践和理解这些概念,你将能更好地理解和创造计算世界中的视觉表现形式。
本资料集包含了对SICP第一章习题的解答,旨在帮助学习者巩固基础,深化对函数式编程的理解。 首先,让我们关注一下习题解答中的几个关键部分: 1. **1.6.ss**: 这部分可能涉及到函数定义、递归和过程抽象。SICP的...
- **λ演算**:SICP引入了λ演算作为理解计算的基础,这是一种形式化的函数定义和应用方式,它是函数式编程语言的理论根基。 - **过程**:在SICP中,过程是λ演算中的核心概念,代表可执行的计算操作。 - **组合...
sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download>>>https://github.com/wizardforcel/sicp-py-zh
- **序列表示 (Representing Sequences)**:介绍了一种用于表示序列的有效方法。 - **层次结构 (Hierarchical Structures)**:讲解了如何构建和操作层次数据结构。 以上是《结构与解释计算机程序》中的一些核心...
SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版
2. **Lisp语言**:SICP主要使用的编程语言是Lisp,一种极简且极具表达力的函数式语言。读者将学会如何读写Lisp代码,理解其语法和特性,如S-表达式、宏系统等。 3. **数据结构与抽象**:书中会涉及各种数据结构,如...
《计算机程序的构造与解释》(Structure and Interpretation of Computer Programs,简称SICP)是一本备受推崇的经典计算机科学教材,由Harold Abelson和Gerald Jay Sussman撰写,并由MIT出版社出版。这本书以其深入...
Lisp是一种古老而强大的编程语言,以其独特的括号语法和函数式编程特性而著名。它在AI(人工智能)领域有着深远的影响,因为Lisp提供了易于处理符号表达式的机制,这对于早期的AI研究至关重要。Lisp的灵活性和可扩展...
《SICP笔记和练习》是一份详尽的资源,主要涵盖了由MIT教授们编写的经典计算机科学教材《Structure and Interpretation of Computer Programs》(简称SICP)的学习笔记和练习解答。这份资料以HTML格式呈现,便于在线...
SICP-Python版本
SICP 使用的scheme解释器 以前叫DrScheme
SICP作为一本经典的计算机科学教材,不仅仅局限于教给学生如何编写代码,更重要的是教会学生如何思考问题、如何设计解决方案。通过深入浅出地讲解各种编程概念和技术,SICP帮助读者建立起强大的思维框架,为成为优秀...
Python SICP epub版本,很适合学习抽象的思想,用Python版本比lisp更实用
总之,学习SICP不仅仅是学习一门编程语言,更是一种思维方式的转变。通过Racket,你可以体验到编程的纯粹和力量,同时提升自己在算法、数据结构、软件设计和系统思考等方面的能力。在实践中不断磨练,你将能够解决更...
《Structure and Interpretation of Computer Programs》(简称SICP)是计算机科学领域的一部经典教材,由Harold Abelson和Gerald Jay Sussman撰写,第二版(2nd Edition)通常被称为SICP 2nd。这本书是麻省理工学院...
标题中的"PyPI 官网下载 | sicp-0.0.1b102.dev4.tar.gz"指的是从Python的官方包索引(Python Package Index,简称PyPI)上下载的一个名为"sicp"的软件包的版本号为0.0.1b102.dev4的压缩文件,其格式是tar.gz。...