SICP 习题 (1.37)解题总结】的更多相关文章

SICP习题1.13要求证明Fib(n)是最接近φn/√5 的整数,其中φ=(1+√5)/2 .题目还有一个提示,提示解题者利用归纳法和斐波那契数的定义证明Fib(n)=(φn - ψn) / √5 . 说实话,面对这道题我是完败,完全没有思路那种.更加令人恼火的是,我根本不明白题目中所谓的提示是什么意思.那感觉就好像某个土豪朋友对你说,几千万的项目太难的话就先投资个几百万就好了,而你手上只有几百块一样. 不过,也不能全怪我吧,多少和出题目的作者有关系,在讲计算机程序的书里跑出一道纯数学题有点过…
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…
SICP 习题1.8需要我们做的是按照牛顿法求平方根的方法做一个求立方根的过程. 所以说书中讲牛顿法求平方根的内容还是要好好理解,不然后面这几道题做起来就比较困难. 反过来,如果理解了牛顿法求平方根的方法,做出一个求立方根的过程就很容易了.当然,我们需要一个改进猜测的方法,就是improve那部分,如果要我自己想出来这个改进方法我觉得是有挑战性的,还好书中直接写出来了,就是:((x / (y * y) )  +  ( 2 * y) )  /  3),其中y是猜测值,x是需要求立方根的数. 根据以…
SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使从网上找来答案看也不能理解其中的真谛. 书中1.2.1节是通过阶乘作为样例来讲解的,可能是因为作者们都是一些天才,所以他们都很喜欢使用数学样例,作为凡人的我们要理解他们在讲什么就需要先理解数学,真的是比较痛苦. 当然,阶乘还算不难啦,看完样例后要理解“迭代计算过程”和“递归计算过程”才是比较麻烦的事…
SICP 习题 1.37是一条非常长的题目,主要讲的是无穷连分式.无穷连分式对我来说又是一个陌生的概念,于是又去百度了一番,发现无穷连分式也是一个非常有意思的话题,涉及到无理数的表达.只是我建议大家还是临时不要深入思考它的数学含义,一旦開始思考可能你又会跳进数学的深渊中不可自拔. 无穷连分式的形式例如以下: 就像书中说到的,作为无穷连分式的一个特殊样例,假设N和D都为1的话,f= 1/ φ, 这点能够结合我们之前对黄金切割率的计算证明,这里就不多说了,并且,假设你不能从数学上理解它也无所谓,不影…
SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”. 就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就怕.所以这道题放了很久都没去动它,不过有担心跳过这道题对后面的学习不利,所以最终还是鼓足勇气尝试做这个题目. 做完了我才发现,其实这道题真的可以跳过,做不做这道题似乎对后面的学习没什么影响.从题目的内容来看,作者应该是希望在习题中引入“树形递归”,让学生在下一节课的学习中有所准备,相当于是预习题.事…
SICP 习题1.38 紧跟着习题1.37的方向,要求我们用习题1.37中定义的cont-frac过程计算数学家欧拉大师在论文De Fractionibus Continuis 中提到的e-2的连分式.说实话,我不知道论文De Franctionibus Continuis讲的是什么.我甚至不知道论文的题目是什么意思.只是,这一切都不能阻止我这个数学盲去解答这道SICP习题. 细致阅读题目,我们能够发现题目要求我们计算的是以下这种无穷连分式: watermark/2/text/aHR0cDovL…
SICP 习题1.41 看似和周边的题目没有关系,突然叫我们去定义一个叫double的过程,事实上这道题的核心还是高阶函数. 题目要求我们定义一个过程double,它以一个过程作为參数,这个作为參数的过程已经约定是一个单參数过程.double过程须要返回一个过程,所返回的过程将传入的过程应用两次. 举例说.假设我们有个过程叫(扇耳光 贱人).调用这个过程会扇贱人一个耳光. 那么(double 扇耳光)会返回还有一个过程.这个过程没有名字,我们暂且叫他"扇俩耳光"吧,调用(扇俩耳光 贱人…
SICP 习题1.39沿着习题1.37, 1.38的方向继续前行,要求我们依据德国数学家J.H.Lambert的公式定义tan-cf过程,用于计算正切函数的近似值. J.H.Lambert的公式例如以下: 能够发现,这个和之前的无穷连分式是一样一样的.所不同的就是N是一个变量,不是固定数值. 只是这个已经难不倒我们啦,能够从公式中发现,除了第一个N是x,其他的N都是x平方. D相应的数值是1,3,5.就是全部奇数,以数字n为下标的话能够通过((n * 2)-1) 得到. 最后直接定义下面过程搞定…
SICP 习题 2.10 要求我们处理区间除法运算中除于零的问题. 题中讲到一个专业程序猿Ben Bitdiddle看了Alyssa的工作后提出了除于零的问题,大家留意一下这个叫Ben的人,后面会不断出现这个人,仅仅要是这个人提到的事情通常是对的,他的角色定位是个计算机牛人,只是是办公室常常能看到的那种牛人,后面还有更牛的. 对于区间运算的除于零的问题,处理起来也比較简单,仅仅须要推断除数是不是为零,除数为零就报错.对于一个区间来讲,所谓为零就是这个区间横跨0,再直接一点讲就是起点是负数,终点是…
SICP 习题 2.7 開始属于扩展练习,能够考虑不做,对后面的学习没什么影响.只是,假设上面的使用过程表示序对,还有丘奇计数你都能够理解的话,完毕这些扩展练习事实上没什么问题. 习题2.7是要求我们协助Allysa完毕interval的定义. Allysa定义了以下的过程来创建一个区间(interval),当中a是起点(就是较小的部分),而b是终点(就是较大部分). (define (make-interval a b) (cons a b)) 题目要求我们实现lower-bound过程和up…
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 习题 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…
SICP 习题 1.34的题目比較特别一点.对于没有接触过高阶函数的同学们来说是个非常好的学习机会. 题目是这种,假设我们定义以下的过程: (define (f g)   (g 2)) 那么就有: (f square) => 4 由于有(f square) => (square 2) => 4 还有 (f (lambda (z) (* z (+ z 1)))) => 6 由于有 (f (lambda (z) (* z (+ z 1)))) => ((lambda (z) (*…
SICP 习题 1.35要求我们证明黄金切割率φ 是变换函数 x => 1+ 1/x 的不动点,然后利用这一事实通过过程fixed-point 计算出φ的值. 首先是有关函数的不动点,这个概念须要理解清晰,后面好几道题都是环绕函数不动点展开的.作者在这里设计这些习题的原因也是希望读者能够关注函数不动点. 事实上有关不动点这个东西我在做习题"1.8"的时候就认为好奇了.为什么"(x+x/y)/2"会不断逼近x的平方根呢?又为什么"(x/y2+2y)/3…
SICP 习题 2.8 须要我们完毕区间运算的减法.区间运算的加法书中已经有了,代码例如以下: (define (add-interval x y) (make-interval (+ (lower-bound x) (lower-bound y)) (+ (upper-bound x) (upper-bound y)))) 以上代码非常easy,就是计算区间的加法时将两个区间的起点相加,称为新区间的起点,然后将两个区间的终点相加.成为新区间的终点. 减法时加法的逆运算,我们看着加法的代码照猫画…
SICP 习题 2.11又出现Ben这个人了,如曾经说到的,仅仅要是Ben说的一般都是对的. 来看看Ben说什么.他说:"通过监測区间的端点,有可能将mul-interval分解为9中情况,每种情况中所须要的乘法都不超过两次". 所以这个叫Ben的人建议Allysa重写mul-interval过程. 究竟是啥意思呢.我们先来看看曾经的mul-interval过程: (define (mul-interval x y) (let (( p1 (* (lower-bound x) (low…
近来在重读SICP,以前读过一次,读了第一二章就没有坚持下去,时间一长就基本忘记了,脑海里什么都不剩,就隐约记得自己曾经读过一本很牛B的书. 这次读希望能够扎实一点,不管能读到哪里,希望可以理解一些东西,以后可以在日常工作中用到,所以开始一道一道地做题,强迫自己深入学习. 后来发现效果不错,于是产生了写解题总结的想法,可以和大家分享,同时加深自己的印象.因为是工作之余才有时间写总结,所以也不能确定更新时间,能写多少是多少吧. 前面几道题比较简答,所以就将1.1,1.2,1.3,1.4这四道题合在…
例题5--9 数据库 Database UVa 1592 #include<iostream> #include<stdio.h> #include<string.h> #include<cmath> #include<string> #include<queue> #include<stack> #include<vector> #include<map> #include<set>…
计算机程序的构造和解释习题解答 Structure and Interpretation os Computer Programs Exercises Answer 第二章 构造数据抽象 练习2.17 (define last-pair-1 (lambda (input) (if (= (length input) 1) input (last-pair-1 (cdr input))))) ;因为length的定义是递归定义的,所以如果是一个长列表,用length会非常耗时 ;last-pair…
题目要求 解题方法 递归计算 没什么好说的,单纯的套用数学公示 (define (f n) (if (< n 3) n (+ (f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3)))) ) ) 迭代计算 和斐波那契的计算一样,只要记录前三次的计算结果用于下一次计算 (define (f-iter a b c cnt) (if (= cnt 1) (+ c (* b 2) (* 3 a)) (f-iter b c (+ c (* b 2) (* 3 a)) (…
代码如下: public class MergeSort { public static void sort(int [] A,int p, int r) { if(p<r) { int q = (int) Math.floor( (p+r)/2 ); sort(A,p,q); sort(A,q+1,r); merge(A,p,q,r); } return ; } public static void merge(int [] A, int p, int q, int r) { int n1 =…
1.11 求f(n)=f(n-1)+2*f(n-2)+3*f(n-3) #lang racket (define (fff n) (define (fff-iter a b c n) (if (= n 0) a (fff-iter b c (+ (* 3 a)(* 2 b) c) (- n 1)))) (fff-iter 0 1 2 n)) 递归版本 #lang racket (define (fff n) (if (< n 3) n (+ (fff (- n 1)) (* 2 (fff (-…
题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位.分析:最后留下的是第n号那位 import java.util.Scanner; public class Prog37{ public static void main(String[] args){ System.out.println("请输入排成一圈的人数:"); Scanner scan=new Scanner(System.in); int n=sca…
练习1.6 new-if的三个参数会先被执行,这样就会无限循环下去 练习1.7 (define (sqrt-iter last-guess guess x) (if (good-enough? last-guess guess) guess (sqrt-iter guess (improve guess x) x)) 另一种解法: (define (good-enough? guess x) (< (/ (abs (- (square guess) x)) guess) (* guess 0.0…
首先反思一下, 昨天做1.14的时候犯了一个严重错误.思维定式了,导致花了非常多无用功. 1.14的关键是要想到2个物理意义. 一个是广度优先, 也就是仅仅考虑问题递归树的第一层子数.那么必定有公式 F(n,m) = F(n- c1, m) + ... + F(n-cm, m) + 1   c1..cm为货币价值, m为货币树. 利用这个公式,我们非常easy用数学归纳法证明存在一个參数C1,满足F(n,m) > C1 * n的m次方. 可是,利用这个公式,我们是无法证明存在一个參数C2.满足F…
习题2.3-7:设计一个算法,对于一个给定的包含n个整数的集合S和另一个给定的整数X,该算法可以在时间内确定S中是否存在两个元素,使得它们的和恰为X. 解题思路:首先应该想到的是先用一个的排序算法对S中的元素进行排序.接下来有两种处理思路,第一种思路是遍历已经排好序了的S中的所有元素a,并采用 二分查找的方法在S中查找X-a,如果能够找到,那么说明S中确实存在两个元素的和为X,算法终止.这种思路很显然是满足的限制要求的:第二种思路是我自己 想出的一个算法,这个算法也很简单,但是其正确性不是很好证…
说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题欢迎留言,对我写的有问题的,欢迎指正,谢谢. 数据库:oracle11g 表结构 可使用plsql-工具-导入表,导入如下sql脚本. 表结构与数据.sql 学生表 Student(SId,Sname,Sage,Ssex)SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别…
Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 .而近期会加入的文章将主要是算法和Android.只是其他内容也会继续完好. About the Author 独立 Windows App 和…