【SICP练习】152 练习4.8】的更多相关文章

练习4-8 原文 Exercise 4.8. "Named let" is a variant of let that has the form (let <var> <bindings> <body>) The and are just as in ordinary let, except that is bound within to a procedure whose body is and whose parameters are the v…
     大概不少programmer都看过<黑客与画家>,作者用了整整一章的篇幅讨论Lisp的强大.我自然就会手痒痒.      几个月前,几天内攻城略地搞定了Python,用的方法便是用Py重写之前开发的类库,这样就能很快熟悉语法,培养语感.喜上眉梢的我,也尝试将同样的策略用在Lisp上,我开始查看它的语法和函数,比如如何定义类和函数,如何赋值等等.      但我慢慢发现,Lisp几乎都不需要学语法,就是括号和几个基本过程,无非就是lambda, define, let,cons,car…
SICP  Structure And Interpretation Of Computer Programs 中文第2版 分两部分  S 和 I 第一章 构造过程抽象 1,程序设计的基本元素 2,过程与他们所产生的计算 3, 用高阶函数做抽象 第二章 构造数据抽象 第三章 模块化.对象和状态 第四章 元语言抽象 第五章 寄存器机器里的计算 (心智的活动,学习.1,组合  简单认识组 为一个符合认识由此产生复杂认识.2,对比  两个认识放在一起对比,得到有关于相互关系的认识.3,将之隔离与其他认…
摘要:软件本身不是目的,人类的需求才是目的,而软件只是达到目的的手段. 软件的本质在于控制复杂性,这个复杂性并非来自于计算机,也并非来自于现实世界,而是来自于人类的思维和知识体系. 软件被使用的广泛性,在于它所满足的人类需求的广泛性. 什么是软件? 从一个简单的例子说起,比如我想计算两个数的和,于是写下这样的python代码 print a + b 但是,这段代码是我的最终目的吗?显然不是,我需要把它在计算机上实际运行,并赋予a和b实际的数值.也许我是在水果,买了5块钱的苹果和10块钱的香蕉,然…
SICP 习题 1.7 是对正文1.1.7节中的牛顿法求平方根的改进,改进部分是good-enough?过程. 原来的good-enough?是判断x和guess平方的差值是否小于0.001,这个过程在一般情况下没什么问题,但是,当需要求平方根的目标本身比较小时就会出现问题. 比如我们求(sqrt-iter 1.0 0.00000016),我们口算都知道结果是0.0004,但是(sqrt-iter)返回的结果大概是0.03125,因为0.03125的平方是.0009765625 ,这个数本身就小…
SICP 习题 1.14要求计算出过程count-change的增长阶.count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程. 要解答习题1.14,首先你需要理解count-change的工作方式,要理解count-change的工作方式,最好是自己去实现一遍count-change. 为了避免自己直接抄书中的代码,我决定自己实现一遍用来找换人民币的的“count-change”.事实上,我在看完并理解count-change的代码后,当我去实现人民币版的“count-ch…
问题描述: 问题链接:152 Maximum Product Subarray 在经典的算法解析中, 有关的分治和动态规划的,经典题型之一就是求最大子段和, 这道题就是他的变形:求最大子段积; 这个问题的核心思路与解决最大子段和相同, 但是唯一需要注意的就是负数的情况. 每次在比较当前最大结果的同时,也需要保存当前最小结果,所以每个当前点i处的取值, 就是从当前值nums[i], 和cur_max+nums[i], cur_min+nums[i]三者中取极值: 每次的取值递推路径如上所示, 应该…
SICP 习题1.8需要我们做的是按照牛顿法求平方根的方法做一个求立方根的过程. 所以说书中讲牛顿法求平方根的内容还是要好好理解,不然后面这几道题做起来就比较困难. 反过来,如果理解了牛顿法求平方根的方法,做出一个求立方根的过程就很容易了.当然,我们需要一个改进猜测的方法,就是improve那部分,如果要我自己想出来这个改进方法我觉得是有挑战性的,还好书中直接写出来了,就是:((x / (y * y) )  +  ( 2 * y) )  /  3),其中y是猜测值,x是需要求立方根的数. 根据以…
牛顿迭代法求平方: (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x) ) ) (define (improve guess x) (average guess (/ x guess))) (define (average x y) (/ (+ x y) )) (define (square x) (* x x)) (define (good-enough? gu…
Chapter 1: Building Abstractions with Procedures 2015-09-29 016 Preface of this chapter QUOTE: The acts of the mind, where in it exerts its power over simple ideas, are chiefly these three ...... (John Locke, An Essay Concerning Human Understanding).…
SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使从网上找来答案看也不能理解其中的真谛. 书中1.2.1节是通过阶乘作为样例来讲解的,可能是因为作者们都是一些天才,所以他们都很喜欢使用数学样例,作为凡人的我们要理解他们在讲什么就需要先理解数学,真的是比较痛苦. 当然,阶乘还算不难啦,看完样例后要理解“迭代计算过程”和“递归计算过程”才是比较麻烦的事…
SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”. 就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就怕.所以这道题放了很久都没去动它,不过有担心跳过这道题对后面的学习不利,所以最终还是鼓足勇气尝试做这个题目. 做完了我才发现,其实这道题真的可以跳过,做不做这道题似乎对后面的学习没什么影响.从题目的内容来看,作者应该是希望在习题中引入“树形递归”,让学生在下一节课的学习中有所准备,相当于是预习题.事…
SICP 2.9 像是一个数学题,要我们证明区间的和与差的宽度是被加和被减的区间的宽度的函数,而对于乘法和除法来说不成立. 书中所谓宽度就是区间起点和终点差的一半.以我看来更像是区间宽度的一半.无论怎么样.差点儿相同是一个意思. 假设你把区间看成是一个线段的话,所谓宽度应该就是起点和终点的差.假设一定要把宽度的一半记作是宽度也无所谓的. 证明区间的和的宽度是被加区间的宽度的函数这一点是比較easy证明的.看以下的证明步骤: 假设有区间1是(a1 b1),还有区间2是(a2 b2), 那么区间1的…
SICP习题1.13要求证明Fib(n)是最接近φn/√5 的整数,其中φ=(1+√5)/2 .题目还有一个提示,提示解题者利用归纳法和斐波那契数的定义证明Fib(n)=(φn - ψn) / √5 . 说实话,面对这道题我是完败,完全没有思路那种.更加令人恼火的是,我根本不明白题目中所谓的提示是什么意思.那感觉就好像某个土豪朋友对你说,几千万的项目太难的话就先投资个几百万就好了,而你手上只有几百块一样. 不过,也不能全怪我吧,多少和出题目的作者有关系,在讲计算机程序的书里跑出一道纯数学题有点过…
SICP 习题 2.7 開始属于扩展练习,能够考虑不做,对后面的学习没什么影响.只是,假设上面的使用过程表示序对,还有丘奇计数你都能够理解的话,完毕这些扩展练习事实上没什么问题. 习题2.7是要求我们协助Allysa完毕interval的定义. Allysa定义了以下的过程来创建一个区间(interval),当中a是起点(就是较小的部分),而b是终点(就是较大部分). (define (make-interval a b) (cons a b)) 题目要求我们实现lower-bound过程和up…
#lang racket (define (square x) (* x x)) (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) (define (improve guess x) (average guess (/ x guess))) (define (average x y) (/ (+ x y) 2)) (define (good-enough?…
在本书的第二章学习时,有一个问题我一直很困扰,那是2.2.4举例节.因为没有华丽的输出模式书,它只能有一个对的英文字母.两三个月的这浅浅的学校前Common Lisp同样是真实的,当.了非常赞的线条,而我仅仅会输出一堆点.后来才知道让Lisp输出图形化界面是更高层次的project,想想还是先把SICP搞定. 上一篇博文中我们谈到了复合数据,关于它有两个重点.第一.数据抽象,这也就意味着你能够隔离那些数据对象.第二.在Lisp中有个特殊的方式能够黏住一些东西.它就是pair,而cons.car.…
SICP 习题 2.6 讲的是丘奇计数,是习题2.4 和 2.5的延续. 这里大师们想提醒我们思考的是"数"究竟是什么,在计算机系统里能够怎样实现"数".准备好開始脑洞大开吧: 题目先讲到以下的定义,首先是0的定义: (define zero (lambda (f) (lambda (x) x))) 然后是操作+ 1的定义: (define (add-1 n) (lambda (f) (lambda (x) (f ((n f) x))))) 接着题目就要求我们依据以…
SICP 解题集 — SICP 解题集 SICP 解题集¶ 这个文档的目标是成为中文化的.完整的<计算机程序的构造和解释>一书的解题集. 这个解题集的特色是: 对于每道习题,除了习题答案之外,还给出习题的讲解和相关资料(如果有的话): 使用 MIT Scheme 作为编程环境,完全避免了代码不兼容的问题: 所有代码都经过测试,确保准确性. 相关软件和链接 介绍了这个解题集中用到的程序和工具. 第一章: 构造过程抽象¶…
上一篇博文相应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么. 书中展示了非常多有趣的句法(syntax). 如今我们要让思想进一步的抽象.写这篇博客的时候并未学完整本书.更不敢说对书中的内容有一个多深的领悟.但我一路学习过来.就感觉书中的演示样例越来越抽象,作者所引导我们的也是如此方向.博文也会持续更新下去,伴随着我的理解. 在这个专栏的[Scheme归纳]4 高阶函数中已经初步介绍了什么是高阶函数(Higher-order Procedures). 而在这一节中,将用高阶…
scheme解释器有两种实现方式,一种是应用序,先对每个参数求值,再以首过程对所有求得的参数求值. 第二种是正则序,会“完全展开然后归约”(书中原文) SICP中的练习1.5,让我困惑了一下.原题如下: Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用何种序求值,是采用应用序,还是采用正则序.他定义了下面两个过程: (define (p) (p)) (define (test x y) () y)) 而后他求值下面的表达式: (test 0 (p)) 问题:不同的求值序,结果…
SICP 2.15 是接着 题目 2.14 的, 题目 2.14中提到了Alyssa设计的区间计算模块在并联电阻计算时会出现故障,这个问题是Lem发现的. 接着,一个叫Eva的人也发现了这个问题.同一时候她还有更深入的思考. Eva认为.假设一个公式能够写成一种形式,当中具有非准确性的变量不反复出现.那么Alyssa的系统产生的区间的限界会更紧一些. 因此,她认为在计算并联电阻时,公式"1/(1/R1 + 1/R2)"比公式"(R1*R2)/ (R1 + R2)"要…
近来在重读SICP,以前读过一次,读了第一二章就没有坚持下去,时间一长就基本忘记了,脑海里什么都不剩,就隐约记得自己曾经读过一本很牛B的书. 这次读希望能够扎实一点,不管能读到哪里,希望可以理解一些东西,以后可以在日常工作中用到,所以开始一道一道地做题,强迫自己深入学习. 后来发现效果不错,于是产生了写解题总结的想法,可以和大家分享,同时加深自己的印象.因为是工作之余才有时间写总结,所以也不能确定更新时间,能写多少是多少吧. 前面几道题比较简答,所以就将1.1,1.2,1.3,1.4这四道题合在…
SICP 习题 1.37是一条非常长的题目,主要讲的是无穷连分式.无穷连分式对我来说又是一个陌生的概念,于是又去百度了一番,发现无穷连分式也是一个非常有意思的话题,涉及到无理数的表达.只是我建议大家还是临时不要深入思考它的数学含义,一旦開始思考可能你又会跳进数学的深渊中不可自拔. 无穷连分式的形式例如以下: 就像书中说到的,作为无穷连分式的一个特殊样例,假设N和D都为1的话,f= 1/ φ, 这点能够结合我们之前对黄金切割率的计算证明,这里就不多说了,并且,假设你不能从数学上理解它也无所谓,不影…
SICP 2.12 要求我们定义一个构造函数make-center-percent,它接收两个參数,分别代表中心点和一个误差百分比.我们须要通过这个构造函数产生一个区间.此外还须要定义一个选择函数percent,用来获取指定区间的误差百分比. 还有就是须要实现一个center函数用于获取区间的中间点. 这里的关键就是要我们明确一个复合数据类型可能会有不同的表现形式,比方这里的区间能够用起点和终点表示,也能够使用中心点和误差表示. 从内部实现来讲,能够简单的将两种表现形式相关的数据都保存起来,比方…
SICP 1.45是对前面非常多关于不动点的习题的总结. 题目回想了我们之前在1.3.3节使用的不动点寻找方法.当寻找y -> x/y 的不动点的时候,这个变换本身不收敛.须要做一次平均阻尼才干够. 对于y -> x/(y^2)这个变换也能够通过一次平均阻尼使它变得收敛. 只是一次平均阻尼对于四次方程是不够的,就是说,对y -> x/(y^3)这种变换,一次平均阻尼不足以使它收敛,须要做两次平均阻尼才行. 题目遵从一直以来的抽象原则.要求我们去多做几次測试,找出 y -> x /…
题目:http://uoj.ac/problem/152 orzKPM... 分治,把数字是l~mid的拿出来放在一根柱子上,mid+1~r放在另一根柱子上.如此递归下去,每次递归只是改一下方向,l,r.然后只要处理r-l<=1的情况就可以了. #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cstdlib> #i…
默认的Racket是要对函数参数进行求值的, 例如(f 1 (+ 1 2))里面,(+ 1 2)要先求值为3,变为(f 1 3)再进行下一步操作.因此, Racket若按照SICP使用define关键字来定义延时计算的关键函数delay和cons-stream是不可行的, 需要用宏来定义,绕过求值. #lang racket (define (memo-proc proc) (let ((already-run? #f) (result #f)) (lambda () (if already-r…
今天使用LogMiner找回误更新的数据时,查询v$logmnr_contents时,遇到了"ORA-04030: out of process memory when trying to allocate 152 bytes (Logminer LCR c,krvtadc)"错误.查了一下My Oracle Support,发现出现ORA-04030错误的原因,特摘录在此. 如果指定了COMMITTED_DATA_ONLY选项而且发出了查询,则LogMiner会在内存中的单个事务中逐…
SICP 习题 1.43 是前面两道题的延续,习题要求我们定义一个过程(repeat f n) .当中f是一个单參数过程.题目要求我们通过repeat过程将过程f调用n次,注意是嵌套调用n次,不是连续调用n次.就是说结果应该是(f ( f ( - (f x) -))).而不是(begin (f x) (f x) (f x) - (f x)). 题目还提醒我们使用习题1.42所定义的compose方法. 细致想想的话这一工作能够通过递归调用完毕,就是(repeat f n) 等于 (compose…