此题与1.32、1.33是一个系列题,没什么难度,只不过把sum的加改成乘就可以了,递归与迭代版本相应修改即可:
<!---->;(define (product term a next b)
; (if (> a b)
; 1
; (* (term a) (product term (next a) next b))))
(define (product-iter term a next b result)
(if (> a b)
result
(product-iter term (next a) next b (* result (term a)))))
分号注释的是递归版本。利用product过程生成一个计算pi的过程,也是很简单,通过观察公式的规律即可得出:
<!---->(define (product term a next b)
(product-iter term a next b 1))
(define (inc x) (+ x 2))
(define (pi-term n)(/ (* (- n 1) (+ n 1)) (* n n)))
(define (product-pi a b)
(product pi-term a inc b))
测试一下:
<!---->
> (* 4 (product-pi 3 1000))
3.1431638424191978569077933
再来看习题1.32,如果说sum和product过程是一定程度的抽象,将对累积项和下一项的处理抽象为过程作为参数提取出来,那么这个题目要求将累积的操作也作为参数提取出来,是更高层次的抽象,同样也难不倒我们:
<!---->(define (accumulate combiner null-value term a next b)
(if (> a b)
null-value
(combiner (term a) (accumulate combiner null-value term (next a) next b))))
OK,其中combiner是进行累积的操作,而null-value值基本值。现在改写sum和product过程,对于sum过程来说,累积的操作就是加法,而基本值当然是0了:
<!---->(define (sum term a next b)
(accumulate + 0 term a next b))
而对于product,累积操作是乘法,而基本值是1,因此:
<!---->(define (product term a next b)
(accumulate * 1 term a next b))
测试一下过去写的那些测试程序,比如生成pi的过程,可以验证一切正常!
上面的accumulate过程是递归版本,对应的迭代版本也很容易改写了:
<!---->(define (accumulate-iter combiner term a next b result)
(if (> a b)
result
(accumulate-iter combiner term (next a) next b (combiner result (term a)))))
(define (accumulate combiner null-value term a next b)
(accumulate-iter combiner term a next b null-value))
再看习题1.33,在accumulate的基础上多增加一个filter的参数(也是一个过程,用于判断项是否符合要求),在accumulate的基础上稍微修改下,在每次累积之前进行判断即可:
<!---->(define (filtered-accumulate combiner null-value term a next b filter)
(cond ((> a b) null-value)
((filter a) (combiner (term a) (filtered-accumulate combiner null-value term (next a) next b filter)))
(else (filtered-accumulate combiner null-value term (next a) next b filter))))
比如,求a到b中的所有素数之和的过程可以写为(利用以前写的prime?过程来判断素数):
<!---->(define (sum-primes a b)
(filtered-accumulate + 0 identity a inc b prime?))
测试一下:
<!---->> (sum-primes 2 4)
5
> (sum-primes 2 7)
17
> (sum-primes 2 11)
28
> (sum-primes 2 100)
1060
分享到:
相关推荐
《计算机程序的构造和解释》...通过解答SICP的习题,读者将深入理解这些概念,并能运用到实际的编程实践中。习题旨在促进对这些基本原理的深入思考,帮助程序员建立坚实的基础,进而在面对复杂的编程挑战时能游刃有余。
针对提供的文件名,我们可以推测这些是该章节练习题的解答,可能包括了用Scheme语言编写的程序或代码片段。 1. **ex2.5.ss**: 这个文件可能包含了对第二章练习2.5的解答。在SICP中,练习2.5通常涉及到了过程定义、...
《SICP习题解答,主要第一章的内容习题答案》 SICP,全称《Structure and Interpretation of Computer Programs》(计算机程序的构造和解释),是计算机科学领域的一本经典教材,由MIT(麻省理工学院)的 Harold ...
在" sicp-master "这个压缩包中,可能包含的是对SICP各章节练习题的解答,包括源代码、注释和分析。这些练习通常涵盖了函数式编程的基础,如高阶函数、递归、闭包,以及更高级的主题,如过程构造、数据结构、环境...
在"sicp-solutions"中,你可以找到对SICP书中各个章节练习题的解答,这些解答将帮助读者理解并实践书中所讲解的编程概念和技术。 1. **基本编程构造**:Scheme提供了基础的编程构造,如定义函数(`define`)、求值...
sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download>>>https://github.com/wizardforcel/sicp-py-zh
SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版
《SICP解题集》是一份专注于探讨和解答《结构与解释程序》(Structure and Interpretation of Computer Programs,简称SICP)一书中习题的资源。SICP是计算机科学领域的一本经典教材,由Harold Abelson、Gerald Jay ...
《计算机程序的构造与解释》(Structure and Interpretation of Computer Programs,简称SICP)是一本备受推崇的经典计算机科学教材,由Harold Abelson和Gerald Jay Sussman撰写,并由MIT出版社出版。这本书以其深入...
《SICP 2.2.4 节:图形语言》是计算机科学经典教材《结构与解释程序》(Structure and Interpretation of Computer Programs)中的一个重要章节,它深入介绍了如何利用编程来创建图形,以及如何设计和理解复杂的计算...
从描述来看,笔记作者最初是按照SICP第一版的内容进行记录,直到习题1.31时,转而参考第二版的内容。这意味着笔记中可能包含了第一版和第二版的部分差异,比如新的练习题或更新的解释。 SICP的第一部分主要讨论了...
书中大量的练习题和示例代码鼓励读者动手实践,加深对概念的理解。此外,SICP还引入了许多先进的编程思想和技术,如函数式编程、递归、抽象数据类型等,这些都对现代软件开发产生了深远的影响。 #### 四、总结 ...
《计算机程序构造和解释》(SICP,Structure and Interpretation of Computer Programs)是一本具有深远影响力的计算机...压缩包中的“SICP 北大课件”文件可能包含课件、讲义、习题解答等资料,是学习SICP的宝贵资源。
SICP-Python版本
SICP 使用的scheme解释器 以前叫DrScheme
Python SICP epub版本,很适合学习抽象的思想,用Python版本比lisp更实用
《SICP》全称是《Structure and Interpretation of Computer Programs》,中文译为《计算机程序的构造和解释》。这是一本经典的计算机科学教材,由Harvard大学的 Harold Abelson 和 Gerald Jay Sussman 教授撰写,...
本书名为《a_book_sicp_py》,是一本以Python语言为基础介绍设计模式和计算机科学基础的书籍。根据描述和部分内容,可以提炼出以下知识点: 1. 编程语言的重要性:在计算机科学的宽泛领域中,编程语言扮演着至关...
标题中的"PyPI 官网下载 | sicp-0.0.1b102.dev4.tar.gz"指的是从Python的官方包索引(Python Package Index,简称PyPI)上下载的一个名为"sicp"的软件包的版本号为0.0.1b102.dev4的压缩文件,其格式是tar.gz。...