`

SICP 第一章 1.1.7-1.2.1 学习

    博客分类:
  • FP
阅读更多
练习 1.6
当这样写的时候会内存溢出,原因是无限的递归调用,那是怎么造成递归的呢。原因在于,你将if else定义为一个过程,然后把需要递归的函数当作参数传递给这个过程,new-if的过程定义如下所示:

(define (new-if predicate then-clause else-clause)
  (cond (predicate then-clause)
        (else else-clause)))

可以简单的看成是 new-if( x ,y ,z)
对他的调用如下

(new-if (good-enough? guess x)
          guess
          (sqrt-iter (improve guess x)
                     x)))
可以简单的看成是 new-if(ex,ex,ex)
那么scheme运行的时候会先将参数表达式求值,然后才跳转到具体的过程体中去,假如每个ex都计算完了,每个ex的值假设是 x ,y,z 那么就执行类似如下的过程体:
(cond (x y)
        (else z)))
这是一般的执行过程。
但是在我们这个new-if的第三个参数中是一个递归的函数,这样只要参数是表达式的形式就会一直去解析,那么sqrt-iter就把自己当作参数一直在解析没有终止条件,但是有的人会说终止条件是good-enough?返回true(#t),在某些情况他可能是终止条件,但他属于过程的参数(或者说是函数的参数),那么他就不能算是终止条件,他的真假并不影响解释器继续去解析其他的参数表达式。
所以通过这个例子,我们也可以知道在过程的参数定义中最好不要让参数是被递归调用的过程表达式。

练习 1.7
假设我们的精度设置的是0.001,当我们对0.000000001计算他的平方根时,除法和乘法得出的结果的精准度是以他小数点后N位来决定的,数越小,除法和乘法的精度就依赖于系统对小数运算的支持程度了,在我们没有设置0.001作为比较差值时,这个差值的差异都是以小数点后第M位来决定的,位数越多就表明他们的相近程度越高,也就越接近真实的值,当我们以0.001来限定这个差异的时候,这个差异的范围被扩大了相对于0.000000001这样的比较参数,在很大的一个位范围来比较他们的差异,而不是说更加细的位比较,但是当我把精度设置为0.000000000000001的时候,他的计算结果就比较接近真实值。所以在对小数求平方根的时候需要把精度调整的尽量比小数本身小好几个数量级。

对于比较大的整数求平方跟,比如说是10的10次方,因为可能程序并不直接支持这么大的数的存储就会截取从而丢失精度,因此不是很适合,而且我们的精度选取的0.001.大数之间的差异用0.001来说就太苛刻了,其实可以设置为1,要不计算的时间偏长。

给出新的good-enough?过程定义如下
(define (good-enough? guess x )
  (< (/ (abs( - (improve guess x) guess)) guess ) 0.000001))

然后旧的good-enough?过程定义如下
(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.000001))

然后开始测试,分别用新的,旧的,程序自己实现的sqrt来检测
> (sqrt 0.0000001)        系统自带的
0.00031622776601683794
> (sqrta 0.0000001)       旧的实现
0.0010104595507340792
> (sqrt2 0.0000001)       新的实现
0.00031622776664863746
看来对小数还是很有效果的,系统自带的精度可能要更加高些

对大数开始测试
> (sqrt 999999999999999)   系统自带的
31622776.601683777
> (sqrta 999999999999999)  旧的实现
31622776.601683777
> (sqrt2 999999999999999)  新的实现
31635794.32093877
对大数反而效果变差了,看来对于大数是不能用这样的检测的,因为除法中底数相对太大造成的商非常小可能丢失精度,比较就会失真。

练习 1.8
;求某个数的立方
(define (cube x)(* x (* x x)))

;求某个数的平方
(define (square x) (* x x))

;求两个数之和的三分之一
(define (third x y)(/ (+ x y) 3))

;求某个数的2倍,不用乘法因为乘法在系统中使用加法实现的
(define (twice x)( + x x))

;定义改进函数
(define (improve y x)
  (third (twice y) (/ x (square y))))

;定义终止判断函数
(define (good-enough? y x)
  (< (abs (- (cube y) x)) 0.001))

;定义求立方根的实现函数
(define (cubeRoot-iter y x)
  (if (good-enough? y x )
      y
      (cubeRoot-iter (improve y x)
                 x)))

;定义函数用来包装对其他函数的调用
(define (cubeRoot x)
  (cubeRoot-iter 1.0 x))

练习 1.9
第一个过程:
(+ 4 5)
(+ 3 5)
(。。。。
第二个过程:
(+ 4 5)
(+ 3 6)
不是迭代也不是递归

练习 1.10
(A 1 10)=> 2 的10次 1024
(A 2 4 )=> 4 的 8次 65536
(A 3 3)=>  4 的 8次 65536

过程F x取值为0 则 =>2n 所有的偶数
过程G x取值为1 则会走else => (A 1 n)=2的(A 1 n-1)次        
过程H x取值为2 则会走else => (A 2 n)=2的(A 2 n-1)次 
其中(A n 0)=0

  • 1.8.rar (465 Bytes)
  • 下载次数: 1
分享到:
评论

相关推荐

    sicp-py-zh:[译] UCB CS61a SICP Python 描述 中文版

    docker run -tid -p &lt;port&gt;:80 apachecn0/sicp-py-zh # 访问 http://localhost:{port} 查看文档 PYPI pip install sicp-py-zh sicp-py-zh # 访问 http://localhost:{port} 查看文档 NPM npm install -g sicp-py-zh ...

    lisp--:lisp-- 一个可以跑sicp解释器的lisp--

    “SICP”全称为《Structure and Interpretation of Computer Programs》(计算机程序的构造和解释),是一本经典的计算机科学教材,通常用于教授计算机科学的基础知识,特别是编程语言的原理。书中的许多练习和例子...

    激光表面熔覆SiCp/Ni-Cr-B-Si-C涂层的组织演化及其相确定

    运用激光熔覆技术在AISI1045钢表面制备了30vol-% SiCp/Ni-Cr-B-Si-C涂层。SEM和TEM观察分析表明:SiCp在熔覆过程中完全溶解;涂层结合区组织为共晶结构;涂层组织由初生石墨球G,分布在γ-Ni固溶体枝晶中的M23(C,B)6...

    SiCp/Al-Fe-V-Si复合材料组织与性能的热稳定性 (2008年)

    为研究SiCP/Al-Fe-V-Si复合材料的热稳定性,对多层喷射沉积技术制备的SiC颗粒增强Al-Fe-V-Si合金经过不同温度下的热稳定性实验后进行了硬度检测,并对其显微组织进行了电镜观察。结果表明:随着基体合金材料中Fe含量的...

    Python库 | sicp-0.0.2-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:sicp-0.0.2-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

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

    本资料集包含了对SICP第一章习题的解答,旨在帮助学习者巩固基础,深化对函数式编程的理解。 首先,让我们关注一下习题解答中的几个关键部分: 1. **1.6.ss**: 这部分可能涉及到函数定义、递归和过程抽象。SICP的...

    sicp第二章练习题的解答

    以上就是基于文件名推测的SICP第二章练习题相关知识点。这些内容深入地涵盖了函数式编程的基础和应用,对于提升编程思维和技能大有裨益。实际的学习过程中,通过阅读和理解这些代码,结合原书的理论部分,将有助于...

    sicp-js-zh:【译】NUS CS1101s SICP JavaScript 描述

    NUS CS1101s SICP JavaScript 描述原文:协议:如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。...下载Dockerdocker pull apachecn0/sicp-js-zhdocker run -tid

    sicp-to-z80:一台SICP寄存器机到TI-84 Z80编译器

    最终目标是完全支持SICP指令集,然后使用此编译器将Scheme编译为Z80,或直接将Scheme编写为Z80。 无论哪种方式,该项目对我来说也意味着可以在TI-84(不是最好的语言)上探索Z80装配中的编程。特征显示字符串和数字...

    sicp-Structure and Interpretation of Computer Programs

    - **第一章:通过过程构建抽象**(Building Abstractions with Procedures) - **1.1 程序设计的元素**(The Elements of Programming) - **1.1.1 表达式**(Expressions):介绍基本的数值表达式和符号表达式。...

    SICP_chapter_1-3:我对SICP第二版书内练习的解决方案,在线书中提供的示例作业集,麻省理工学院的6.001课程的项目和考试。 (所有这些仅适用于第1-3章。)

    在这个压缩包中,你将找到作者对第二版书中第1至3章练习题的解决方案,以及与麻省理工学院6.001课程相关的项目和考试题目。以下是这些章节中的核心知识点和学习重点: 1. **基础概念与Lisp语言**: - **Lisp语法**...

    SICP-ANSWER:MIT-Scheme 版本的答案

    SICP-答案 SICP 中的问题解答。 支持两个版本。 除非有注释,否则所有这些都是可运行的。 大多数答案不能保证是正确的,因为它们没有经过深入测试。 但是,第4章中的解释器,即EVAL-APPLY、ANALYZE-EVAL-APPLY、AMB...

    sicp-in-python(中文版+英文版)PD

    sicp-in-python(中文版+英文版)PDF 背景. SICP 全称Structure and Interpretation of Computer Programs,翻译过来叫《计算机程序的构造和解释》使用python

    以聚硅氧烷为先驱体制备Al-SiCp/Si-O-C陶瓷复合材料 (2004年)

    以聚硅氧烷为先驱体,Sic为隋性填料,Al为活性填料,考察了活性填料Al在聚硅氧烷转化制备Sr0-c复合材料中的应用。研究发现:600℃时,活性填料A1能与聚硅氧烷裂解产生的含碳小分子气体反应生成A14C3,800℃时能与N2反应...

    SICP-Python版本

    SICP-Python版本

    SICP中文第二版

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

    sicp-study-group

    CoRecursive Slack SICP研究小组 章节 1-1-1 ::表达式 1-1-2 ::命名与环境 1-1-3 ::评估组合 1-1-4 ::复合程序 1-1-5 ::程序应用的替代模型 1-1-6 ::条件表达式和谓词 1-1-7 ::例子:牛顿法求平方根 1-1-8 :...

    sicp in python 中文 sicp 中文

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

Global site tag (gtag.js) - Google Analytics