`

sicp 习题1.31,1.32,1.33解答

 
阅读更多
    此题与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



dennis 2007-05-14 15:10 发表评论
分享到:
评论

相关推荐

    SICP 习题答案

    《计算机程序的构造和解释》...通过解答SICP的习题,读者将深入理解这些概念,并能运用到实际的编程实践中。习题旨在促进对这些基本原理的深入思考,帮助程序员建立坚实的基础,进而在面对复杂的编程挑战时能游刃有余。

    sicp第二章练习题的解答

    针对提供的文件名,我们可以推测这些是该章节练习题的解答,可能包括了用Scheme语言编写的程序或代码片段。 1. **ex2.5.ss**: 这个文件可能包含了对第二章练习2.5的解答。在SICP中,练习2.5通常涉及到了过程定义、...

    SICP习题解答,主要第一章的内容习题答案

    《SICP习题解答,主要第一章的内容习题答案》 SICP,全称《Structure and Interpretation of Computer Programs》(计算机程序的构造和解释),是计算机科学领域的一本经典教材,由MIT(麻省理工学院)的 Harold ...

    sicp:我的 SICP 练习

    在" sicp-master "这个压缩包中,可能包含的是对SICP各章节练习题的解答,包括源代码、注释和分析。这些练习通常涵盖了函数式编程的基础,如高阶函数、递归、闭包,以及更高级的主题,如过程构造、数据结构、环境...

    sicp-solutions:SICP练习解决方案

    在"sicp-solutions"中,你可以找到对SICP书中各个章节练习题的解答,这些解答将帮助读者理解并实践书中所讲解的编程概念和技术。 1. **基本编程构造**:Scheme提供了基础的编程构造,如定义函数(`define`)、求值...

    sicp in python 中文 sicp 中文

    sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download&gt;&gt;&gt;https://github.com/wizardforcel/sicp-py-zh

    SICP中文第二版

    SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版

    SICP 解题集

    《SICP解题集》是一份专注于探讨和解答《结构与解释程序》(Structure and Interpretation of Computer Programs,简称SICP)一书中习题的资源。SICP是计算机科学领域的一本经典教材,由Harold Abelson、Gerald Jay ...

    SICP(python中文带书签)

    《计算机程序的构造与解释》(Structure and Interpretation of Computer Programs,简称SICP)是一本备受推崇的经典计算机科学教材,由Harold Abelson和Gerald Jay Sussman撰写,并由MIT出版社出版。这本书以其深入...

    sicp 2.2.4节图形语言

    《SICP 2.2.4 节:图形语言》是计算机科学经典教材《结构与解释程序》(Structure and Interpretation of Computer Programs)中的一个重要章节,它深入介绍了如何利用编程来创建图形,以及如何设计和理解复杂的计算...

    sicp_notes:SICP笔记和练习

    从描述来看,笔记作者最初是按照SICP第一版的内容进行记录,直到习题1.31时,转而参考第二版的内容。这意味着笔记中可能包含了第一版和第二版的部分差异,比如新的练习题或更新的解释。 SICP的第一部分主要讨论了...

    sicp-Structure and Interpretation of Computer Programs

    书中大量的练习题和示例代码鼓励读者动手实践,加深对概念的理解。此外,SICP还引入了许多先进的编程思想和技术,如函数式编程、递归、抽象数据类型等,这些都对现代软件开发产生了深远的影响。 #### 四、总结 ...

    北京大学,计算机程序构造和解释(SICP)课件,裘宗燕老师主讲

    《计算机程序构造和解释》(SICP,Structure and Interpretation of Computer Programs)是一本具有深远影响力的计算机...压缩包中的“SICP 北大课件”文件可能包含课件、讲义、习题解答等资料,是学习SICP的宝贵资源。

    SICP-Python版本

    SICP-Python版本

    SICP 使用的scheme解释器

    SICP 使用的scheme解释器 以前叫DrScheme

    Python SICP epub版本

    Python SICP epub版本,很适合学习抽象的思想,用Python版本比lisp更实用

    SICP LISP AI

    《SICP》全称是《Structure and Interpretation of Computer Programs》,中文译为《计算机程序的构造和解释》。这是一本经典的计算机科学教材,由Harvard大学的 Harold Abelson 和 Gerald Jay Sussman 教授撰写,...

    a_book_sicp_py

    本书名为《a_book_sicp_py》,是一本以Python语言为基础介绍设计模式和计算机科学基础的书籍。根据描述和部分内容,可以提炼出以下知识点: 1. 编程语言的重要性:在计算机科学的宽泛领域中,编程语言扮演着至关...

    PyPI 官网下载 | sicp-0.0.1b102.dev4.tar.gz

    标题中的"PyPI 官网下载 | sicp-0.0.1b102.dev4.tar.gz"指的是从Python的官方包索引(Python Package Index,简称PyPI)上下载的一个名为"sicp"的软件包的版本号为0.0.1b102.dev4的压缩文件,其格式是tar.gz。...

Global site tag (gtag.js) - Google Analytics