![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
SICP Exercise
文章平均质量分 58
nomasp
Android 工程师
展开
-
【SICP练习】5 练习1.9
以下是第一个加起两个正整数的方法,其中inc将参数加1,dec将参数减1。(define (+ a b) (if(= a 0) b (inc (+ (dec a) b))))用代换模型展示(+ 4 5)如下:(+ 4 5)(inc (+ 3 5))(inc原创 2015-02-05 12:56:42 · 1690 阅读 · 0 评论 -
【SICP练习】13 练习1.19
练习1.19题目中说道斐波那契数中将变换T的n次方应用于对偶(1,0)而产生出来,而现在将T看作T(pq)中p=0和q=1的特俗情况。因此对于对偶(a,b)来说,a—bq+a(p+q),b—bp+aq。而对于T(pq)的平方也就是(T(pq))^2,就像之前的a中往b乘以q和往a乘以(p+q),现在依旧是相当于a中往bp+aq乘以q(bp+aq为上一次迭代中的”b”),往(bq原创 2015-02-05 19:20:09 · 2154 阅读 · 0 评论 -
【SICP练习】14 练习1.20
练习1.20 这道题要求我们分别在正则序和应用序的情况下来研究书中的gcd函数,并且还要算出实际执行remainder运算的次数。题目中先问的正则序后问的应用序,但由于应用序比较简单,我们先来看看应用序: (gcd 206 40) (gcd 40 6) (gcd 6 4) (gcd 4 2) (gcd 2 0) 2 因此(gcd 206 40)共调用了5次remainder函数。再来原创 2015-02-06 12:22:46 · 2246 阅读 · 0 评论 -
【SICP练习】11 练习1.17
练习1.17这道题中有2个需要我们自己先写出来的函数double和halve,当然了,这都非常容易实现:(define(double x) (+ x x))(define(halve x) (/ x 2))题目中要求我们设计一个类似于fast-expt的求乘积的过程,并且只用对数的步数。(define(原创 2015-02-05 19:14:54 · 2482 阅读 · 0 评论 -
【SICP练习】6 练习1.10
我们先将Ackermann函数写入Edwin中,当然了,再获取结果之前应该先自己用笔算算。结果如下:(A 1 10);Value: 1024(A 2 4);Value: 65536(A 3 3);Value: 65536其中65536也就是16的四次方。接下来通过连续的n值来观察题目中随后给出的几个过程。和之前一样,直接代原创 2015-02-05 13:19:33 · 2329 阅读 · 0 评论 -
【SICP练习】25 练习1.31
练习1.31题目中已经说的很清楚了,product用来返回在给定范围中各点的某个函数值的乘积。我们惊奇的发现这和前面的sum有着很大的相似,无非是将加法换成了乘法:(define (product term a next b) (if(> a b) 1 (* (term a) (product原创 2015-02-07 10:35:40 · 2118 阅读 · 0 评论 -
【SICP练习】26 练习1.32
练习1.32因为递归比迭代要更容易实现,因此我先考虑的递归。先将sum和product都列出来。(define (sum term a next b) (if(> a b) 0 (+(term a) (sum term (next a) next b))))(define (pr原创 2015-02-07 10:36:31 · 1929 阅读 · 0 评论 -
【SICP练习】28 练习1.34
练习1.34这道题我一开始不用Edwin的时候觉得是会陷入无限循环之中。后来在Edwin上试了一下才发现会报错,输出如下:(f f);The object 2 is notapplicable.;To continue, call RESTARTwith an option number:; (RESTART 2) => Specify a原创 2015-02-07 13:51:31 · 1850 阅读 · 0 评论 -
【SICP练习】24 练习1.30
练习1.30这道题要求将一个递归的规程改成是迭代的,通过对递归版本的sum的观察得出以下变换形式:a—(next a)other—(+ (term a) other)博主英文不太好实在想不出什么好词语了。变换成迭代通俗点讲就是要将sum中最后一行的加号去掉,因为这个是消耗大量空间的根源。如果我们将a和other作为迭代中的产生,将这个过程展开即有原创 2015-02-07 10:34:09 · 1782 阅读 · 0 评论 -
【SICP练习】38 练习1.43
练习1.43我不想一开始就将结果贴出啦,而是通过叙述自己的思考来完成这篇博客。上一题中我在纸上写下“传入2个过程并返回1个过程”,事实证明挺有效的,于是这次我也依旧这么做了。repeated需要传入一个过程和一个数字,这个数字决定了这个过程的执行次数。repeated还要返回1个过程,而这个过程又要传入一个数字,这个数字又将通过前面传入的过程来运算。确实挺绕的。原创 2015-02-17 20:04:57 · 1774 阅读 · 0 评论 -
【SICP练习】54 练习2.22
练习2.22题目中Louis的第一个程序将items中的元素一个一个的取出来然后平方然后”推“到answer中。而我们在上一题中则是迭代结构,是将元素平方后”推“到一个大盒子中,而大盒子里又有一个元素被平方然后被”推“到另一个稍微小点的大盒子中去。而修改后的程序看似解决了问题,其实错得更加离谱了。比如用(list 1 2 3 4 5)作为items一开始传入,程序先将1原创 2015-02-22 13:49:27 · 1964 阅读 · 0 评论 -
【SICP练习】64 练习2.35
练习2.35这道题中已经给定了accumulate和map,根据accumulate的参数可以很容易的知道题目中的2处需要我们补充的:(accumulate + 0 (map ...... 因为我们是要累加所有的树叶,这里就需要在map里有一个lambda来讲t中的树叶全部遍历出来,map的第二个参数自然就是t了。而遍历t的过程中,遇到的节点有可能只是一片树叶,但也原创 2015-02-22 13:57:27 · 1462 阅读 · 0 评论 -
【SICP练习】66 练习2.37
练习2.37这道题花了我太长的时间了,一开始我就把题目中的m看成了w。然后题中给出的dot-product的两个参数我还以为一个是向量另一个是矩阵。怎么算都算不出来,直到看到“返回求和...”里的w只有一个i而没有j。好了,那么开始按照题目的要求来做题了。既然发现了自己的错误,那么就知道了dot-product是干嘛的了,它可以用来求一个矩阵中的一列和一个向量的积。因此原创 2015-02-22 13:58:38 · 1480 阅读 · 0 评论 -
【SICP练习】43 练习2.2
练习2.2(define(make-segment start-point end-point)(cons start-point end-point))(define(start-segment seg)(car seg))(define(start-segment seg) (cdr seg))(define(mak原创 2015-02-17 20:08:36 · 2198 阅读 · 0 评论 -
【SICP练习】32 练习1.38
练习1.38我最喜欢做数学上的观察题了,这里也有一个Di,其依次为1,2,1,1,4,1,1,6,1,1,8……我最先看到的是除了一开始的2个之外,每三个数字的规律是前面是两个1,后面是个递增的偶数。于是我们便可轻而易举的写出这个函数了。(define (d i) (if (= (remainder (- i 2) 3) 0) (* (原创 2015-02-17 20:00:29 · 1314 阅读 · 0 评论 -
【SICP练习】33 练习1.39
练习1.39没想到最后一道题如此简单,n和d的过程可以如下定义:(define (n i) (if (= i 1) i (- (* i i))))(define (d i) (- (* 2 i) 1))这里我们就不再重复写成块结构了。(define (tan-cf x k)原创 2015-02-17 20:01:08 · 2214 阅读 · 0 评论 -
【SICP练习】44 练习2.3
练习2.3我们并不必急于写出点什么,先来回过头看看书吧。第56页说到了一种称为按愿望思维的强有力的综合策略。在这道题里,我们就可以假设已经写好了能够表示矩形的代码,以及能够求矩形长和宽的函数。于是像先定义出add-rat一样,我们先定义出求矩形的周长和面机的函数。(define(get-perimeter x)(let ((length (rectang原创 2015-02-17 20:09:32 · 2143 阅读 · 0 评论 -
【SICP练习】68 练习2.39
练习2.39通过前一习题的类比相信已经知道了fold-left和fold-right的内在意义,本题中要求的逆序数可以用cons来构造。具体为,先将list的第一个元素取出用(cons (car list) ‘() )构造,接着第二个、第三个……用(cons…… (cons (car (car list) ) (cons (carlist) ‘())))。当然了,在这个原创 2015-02-22 13:59:37 · 1628 阅读 · 0 评论 -
【SICP练习】50 练习2.18
练习2.18这道题也不难,通过迭代来完成。不过我想整个过程,无论是两个define还是一个define,都只用一个参数,但还为完成,希望有谁会的在博文下面评论咯。(define (reverse list) (reverse-iter list ‘()))(define (reverse-iter list other) (if (nul原创 2015-02-22 13:47:14 · 2592 阅读 · 0 评论 -
【SICP练习】61 练习2.31-2.32
练习2.31我想说我已经越来越喜欢抽象了,将上一题中的map版本的square-tree抽象的方法是添加一个参数f,f是一个函数,因此将square替换成f即可。如下。(define (map-tree f tree) (map (lambda (sub-tree) (if (pair? sub-tree)原创 2015-02-22 13:55:59 · 1300 阅读 · 0 评论 -
【SICP练习】51 练习2.19
练习2.19这道题的题目比较长,但是难度却不大的。无非就是用cons、car、cdr等等,就像前面的矩形啊点啊什么的。(define (first-denominationcoin-values) (car coin-values))(define (except-first-denominationcoin-values) (cdr c原创 2015-02-22 13:47:33 · 1750 阅读 · 0 评论 -
【SICP练习】69 练习2.40
练习2.40这道题要我们写一个传入一个整数n然后返回一个序对(i, j)的过程unique-pairs,然后用于上一页的prime-sum-pairs的定义。此时我们要注意在prime-sum-pairs中哪一段代码表达的是这个意思。没错,是flatmap函数。因此我们将其写入到unique-pairs中。(define (unique-pairs n) (原创 2015-02-22 14:00:03 · 1874 阅读 · 0 评论 -
【SICP练习】41 练习1.46
练习1.46这道题要求我们写一个过程iterative-improve,其接受两个过程为参数,一个是判断检测是否足够好的good-enough?和另一个改进猜测的improve。其有一个猜测的数字作为参数,然后返回的是一个过程。我们先来写出这个iterative-improve过程。(define (iterative-improveclose-enough?原创 2015-02-17 20:06:45 · 1407 阅读 · 0 评论 -
【SICP练习】42 练习2.1
练习2.1我们已经进入了新的一章,这本书还是蛮会循序渐进的嘛,第一题挺简单的。(define(make-rat n d) (let ((g (gcd n d))) (if ( (cons (- (/ n g)) (- (/ d g))) (cons n d))))原创 2015-02-17 20:08:09 · 2318 阅读 · 0 评论 -
【SICP练习】52 练习2.20
练习2.20如果读懂了题目的意思这道题也是不难的,重点就是带点尾部记法形式的define。下面我们就来写出same-parity过程。(define (same-parity fist . other) (filter (if (even? fist) even? odd?)原创 2015-02-22 13:48:06 · 1820 阅读 · 0 评论 -
【SICP练习】72 练习2.43
练习2.43因为对于(enumerate-interval 1 board-size),Louis的过程会产生(queen-cols (- k 1))个棋盘,而上一练习中给出的代码则只产生board-size个棋盘。上一练习中,如果board-size为8,则会产生行列均为1、2……8的8个棋盘。原创 2015-02-22 14:02:10 · 1979 阅读 · 0 评论 -
【SICP练习】40 练习1.45
练习1.45如果看到前面的文章,应该知道我喜欢将某个变量n先设成一个固定的数比如3、4什么的。这里我们依旧如此,先来看看如何写出开四次方根的过程。这道题的目的旨在让我们好好回顾前面的内容,毕竟只剩下一道题我们就完完全全的解决了第一章。下面我来带大家一起回顾一下。fixed-point是以1个函数和一个初始猜测为参数的函数,用来计算不动点。所谓的不动点就是x=f(x)时的原创 2015-02-17 20:06:09 · 1765 阅读 · 0 评论 -
【SICP练习】57 练习2.27
练习2.27又是修改程序的题目,要求我们写出的deep-reverse函数要将表中的元素也反转过来,这其中应该要用到递归来实现吧。(define (deep-reverse tree) (cond ((null? tree) ‘()) ((not (pair? tree)) tree) (else (r原创 2015-02-22 13:51:13 · 1808 阅读 · 0 评论 -
【SICP练习】30 练习1.36
练习1.36这道题要求我们根据书上的newline和display来完成一个新版本的fixed-point。根据题目内容我们分为如下步骤:1、写出能够打印出计算中产生的近似值序列的函数。2、将第一步中的函数写入fixed-point中。3、根据题中的映射关系写出对应函数。4、根据下一节的内容写出一个利用平均阻尼技术的函数。5、测试以及对比原创 2015-02-17 19:59:20 · 1810 阅读 · 0 评论 -
【SICP练习】39 练习1.44
练习1.44相信如果大家认真做了前面的几道习题,这一题就比较简单了。smooth过程几乎可以直接写出:(define smooth(lambda (f) (lambda (x) (/ (+ (f (- x dx)) (f x) (f (+ x dx)))原创 2015-02-17 20:05:40 · 1724 阅读 · 0 评论 -
【SICP练习】71 练习2.42
练习2.42这道题曾经在C#中写过,但是写出来的代码却没有Lisp中的朴素。用了一大堆的数组和for循环。但是在这里,用car、cdr来构造就行了。我们按书中给出的步骤来一步一步求解这个问题。首先是棋局,就按书上的示意图,从上往下的来排皇后的位置。诸如此时书中皇后的位置为:’(6 3 1 7 5 8 2 4)。然后就是过程adjoin-position。rest原创 2015-02-22 14:01:26 · 2133 阅读 · 0 评论 -
【SICP练习】31 练习1.37
练习1.37根据题目中的意思通过观察得到k项有项连分式的一种表达方式:f=N1/(D1+(N2/(…+Nk/Dk)))这个式子可以不断展开,但如果我们把每一个”+”后面的式子记作T(i)。不对,我们应该将每一个N/D记作T(i),因为这组式起始于N/D,且中止与N/D。计N1/D1为T(1),N2/D2为T(2),Nk/Dk为T(k)。在数学上可能不会联想到递归原创 2015-02-17 19:59:44 · 1457 阅读 · 0 评论 -
【SICP练习】84 练习2.56
练习2.56 这道题的代码略长啊。不过我也是因此而知道Edwin上的代码居然可以复制到word上,以前还想当然的以为不能复制的,毕竟在Edwin上粘贴用的Ctrl+Y,而不是Ctrl+V。在这里我就只将书上没有的代码贴出来了。(define (deriv exp var) (cond ((number? exp) 0) ((variable? exp)原创 2015-03-05 10:36:35 · 1686 阅读 · 0 评论 -
【SICP练习】83 练习2.55
练习2.55 书上已经说过了在求值过程中引号会被替换成quote。因为表达中有2个单引号,因此car得到了第二个单引号。如果是cdr则会得到后面的一串字母。 (cdr ‘’abracadabra) ;Value: (abracadabra)原创 2015-03-05 10:34:58 · 1635 阅读 · 0 评论 -
【SICP练习】8 练习1.12
这道练习的翻译有误。原文是:Write a procedure that computes elements of Pascal’s triangle bymeans of a recursive process.正确的翻译应该是计算帕斯卡三角形的各个元素。y :0 11 1 12 1 2 13 1原创 2015-02-05 15:55:14 · 1639 阅读 · 0 评论 -
【SICP练习】3 练习1.7
练习1.7这道题回应了第15页所说的good-enough?并不是一个很好的检测方法。我们首先来按照题目要求用4组最大或最小的数来检测原文中的good-enough?(sqrt-iter 1.0 0.00000081) 0.0009;Value: 0.3125863108711088(sqrt-iter 1.0 0.原创 2015-02-05 11:10:15 · 2286 阅读 · 0 评论 -
【SICP练习】74 练习2.45
练习2.45我们先将right-split和up-split抽象出一个split来。(define (split big-combinersmall-combiner) (lambda (painter n) (if (= n 0) painter (let ((smaller原创 2015-02-22 14:03:22 · 2069 阅读 · 0 评论 -
【SICP练习】75 练习2.46
练习2.46这道题就是彻头彻尾的”构造”了。直接上代码吧。(define (make-vect xcor ycor) (listxcor ycor))(define (xcor-vect v) (car v))(define (ycor-vect v) (cdr v))(define (add-vect first-vectsecond-vect原创 2015-02-22 14:03:36 · 2443 阅读 · 0 评论 -
【SICP练习】46 练习2.5
练习2.5这道题的意思是有一个新的cons,其接受两个参数a、b,并且返回(2^a)*(3^b)。这个比较容易实现了。(define (cons a b) (* (expt 2 a) (expt 3 b)))(cons 2 2);Value: 36根据题中的意思,并将其与car和cdr类比,得知car是要分离出2^a,cdr是要分离出原创 2015-02-17 20:10:57 · 2941 阅读 · 0 评论 -
【SICP练习】22 练习1.28
练习1.28这道题主要分为三个部分:1、非平凡平方根,并添加到expmod函数中2、类似于fermat-test的过程3、通过已知的素数和非素数来检验下面我们首先来写出能够在遇到非平凡平方根的时候报错的函数,在这个函数中:当x不等于1,x不等于(n-1),并且x的平方对n取余等于1,这三个条件都为真时则可以说遇到了“1取模n的非平凡平方根”。下面原创 2015-02-07 10:31:25 · 2352 阅读 · 0 评论