E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
sicp
【
SICP
归纳】2 高阶函数和数据抽象
上一篇博文对应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么。书中展示了很多有趣的句法(syntax)。现在我们要让思想进一步的抽象,写这篇博客的时候并未学完整本书,更不敢说对书中的内容有一个多深的领悟。但我一路学习过来,就感觉书中的示例越来越抽象,作者所引导我们的也是如此方向。博文也会持续更新下去,伴随着我的理解。在这个专栏的【Scheme归纳】4高阶函数中已经初步介绍了什么
NoMasp
·
2015-03-14 15:00
SICP
lisp
syntax
高阶函数
数据抽象
【
SICP
归纳】1 过程和代换模型
《计算机程序的构造和解释》这本书的目标并不是讲解一门编程语言的语法等,它是一种方法。不是在向你陈述知识,而是在教你如何做到想要做的东西。它是一个过程,一个精神。这些引导过程的东西就是所谓的程序规则的模式。书中用了许多的例子来诠释书名,我才疏学浅就不再举例往博客上推了,仅仅归纳一点总结而已。如果说程序是一种法术,那么控制神奇的法术就是过程。因此我们需要一门叫做Lisp的语言来唤醒这种精神。从书中的讲
NoMasp
·
2015-03-12 22:00
模式
编程语言
方法
表达式
控制
【
SICP
练习】106 练习3.7
练习3-7原文Exercise3.7.Considerthebankaccountobjectscreatedbymake-account,withthepasswordmodificationdescribedinexercise3.3.Supposethatourbankingsystemrequirestheabilitytomakejointaccounts.Defineaprocedur
NoMasp
·
2015-03-11 18:00
Objects
SICP
requires
account
created
【
SICP
练习】105 练习3.5-3.6
练习3-5原文Exercise3.5.MonteCarlointegrationisamethodofestimatingdefiniteintegralsbymeansofMonteCarlosimulation.ConsidercomputingtheareaofaregionofspacedescribedbyapredicateP(x,y)thatistrueforpoints(x,y)i
NoMasp
·
2015-03-11 18:00
Predicate
integration
region
area
computing
Python求解平方根的方法
具体如下:主要通过
SICP
的内容改写而来。基于newtonmethod求解平方根。代码如下:#!
苏巴什
·
2015-03-11 16:54
[置顶] HTML5 Project Quick Guide
HTML5ProjectQuickGuideHTML5ProjectQuickGuideGetaba
sicp
rojecttemplateLibrarythirdpartylistLocalesupportjQuerysupportGetaba
sicp
rojecttemplatenameurl
wxqee
·
2015-03-11 11:00
html5
template
project
【
SICP
练习】104 练习3.1-3.4
练习3-1原文Exercise3.1.Anaccumulatorisaprocedurethatiscalledrepeatedlywithasinglenumericargumentandaccumulatesitsargumentsintoasum.Eachtimeitiscalled,itreturnsthecurrentlyaccumulatedsum.Writeaproceduremak
NoMasp
·
2015-03-08 17:00
Scheme
procedure
SICP
lisp
入Functional Programming到底我该选择Lisp还是Haskell?
要学习Lisp的,可以看看
sicp
,当初我花费了一个暑假的时间啃
sicp
,啃到啃不动了,但是发现确实学到了不少有趣的东西,然后又去玩Haskell,大概学习Haskell断断续续的也有半年的时间,但是我感觉我在
firebroo
·
2015-03-08 12:00
【
SICP
练习】103 练习2.81-2.97
练习2-81这里再次需要用到第186页的创建表格部分内容。当然了现在完全可以只是将make-table加载到这道题中。还有我们前面几题中用到的apply-generic。a)载入Louis的强制过程后,对两个复数调用exp会出现解释器假死的情况。b)Louis并没有纠正该问题,反而会让程序进入无限循环之中。c)解决这个错误的办法就是让apply-generic能够在其两个输入的参数的类型相同时让强
NoMasp
·
2015-03-06 12:00
apply
generic
exp
解释器
【
SICP
练习】102 练习2.79-2.80
练习2-79首先需要加载第125页的apply-generic函数,然后添加题中要求的通用型操作equ?。(define(equ?xy)(apply-generic‘equ?xy))题目要求我们能够处理常规的数、有理数和复数。分别列出如下。常规数:(define(install-scheme-number-package)(define(tagx)(attach-tag'scheme-number
NoMasp
·
2015-03-06 12:00
Install
操作
apply
generic
define
【
SICP
练习】101 练习2.77-2.78
练习2.77我们首先来看看题目中描述的问题,当LouisReasoner试着求值(magnitudez)时,程序中不断的寻找。一开始是通过apply-generic、而后是map,最后是get。这三个函数在书中都有很好的解释,我自知才疏学浅就不介绍了。最后一步的get中,最后由于找不到匹配的参数而返回了#f。而在Alyssa的程序中则不然。具体请看代码。(define(install-rectan
NoMasp
·
2015-03-06 12:00
参数
Install
apply
generic
define
【
SICP
练习】100 练习2.76
练习2.76这是一道论述题了吧。首先是带有显示反派的通用型操作,这种策略要求使用者留意命名方面的冲突。如书上所说,这种策略具有不可加性,因为每当增加新类型的时候,所有通用型操作都要求做相应的修改以适配新的类型。至于增加新的操作,同样因为这一点而不适用。然后是数据导向的风格,如书上的大片论述和我们所做的习题都可以看出来,这种策略对于增加新类型和增加新操作都很适合。而消息传递我们的学习并不深入,但根据
NoMasp
·
2015-03-06 12:00
命名
显示
cond
消息传递
【
SICP
练习】99 练习2.75
练习2.75通过模仿书上的make-from-real-imag函数来完成此题。(define(make-from-mag-angxy)(define(dispatchop)(cond((eq?op‘real-part)(*x(cosy)))((eq?op‘imag-part)(*x(siny)))((eq?op‘magnitude)x)((eq?op‘angle)y)(else(error“Un
NoMasp
·
2015-03-06 12:00
Dispatch
define
eq
cond
OP
【
SICP
练习】98 练习2.73
练习2.73a小题,这是由于Scheme对数字、变量的直接规定,前者会被当作数值类型,后者则会被当作符号类型。因此没必要将这两个谓词添加到数据导向分派中了。如果给数值类型或者符号类型加上一个标志,在get的过程中,又对已知的类型做判断,岂不是在浪费空间和时间。b小题,我们根据书中已有的范例来完成这道题,也即是第123页最下面到第125页最上面的内容。(define(install-sum-pack
NoMasp
·
2015-03-06 12:00
变量
数据
Install
SUM
define
【
SICP
练习】97 练习2.70
练习2.70既然要解码,那必须先将树给定义好了。(definetree(generate-huffman-tree‘((A2)(NA16)(BOOM1)(SHA3)(GET2)(YIP9)(JOB2)(WAH1))然后就是来编码题目中给出的歌词了。(definemessage-1‘(Getajob)) (definemessage-2‘(Shanananananananana)) (definem
NoMasp
·
2015-03-05 10:00
tree
message
generate
define
给定
【
SICP
练习】96 练习2.69
练习2.69如题目中所说,传入给successive-merge的参数是一个有序的集合。而这个函数将通过不断的归并得到最终的一个元素。如果传入的集合为0,也就是说返回的表应该是空表。如果传入的集合为1,那么将传入的集合的car部分取出来,这就是Huffman树了。而如果传入的集合大于1,那么就要多做些处理了。因为集合已经做好了排序,这里所谓的排序自然就是按照的权重了。因此最前面的元素其权重也最小。
NoMasp
·
2015-03-05 10:00
集合
参数
元素
merge
car
【
SICP
练习】94 练习2.67
练习2.67我们先来把该导入的导入,然后就来测试了。(load"d:\\lisp\\tree.scm") (definesample-tree(make-code-tree(make-leaf'A4)(make-code-tree(make-leaf'B2)(make-code-tree(make-leaf'D1)(make-leaf'C1))))) (definesample-message'(
NoMasp
·
2015-03-05 10:00
二叉树
tree
define
entry
键值
【
SICP
练习】95 练习2.68
练习2.68先要导入练习2.67中的sample-tree。这道题要求我们写出能够根据给定的树产生出给定符号的二进制位表的函数encode-symbol,这个函数还要能够在遇到未在树中出现的符号时报错。这个函数将要在给定的树中查找给定符号的叶子节点,并记录下寻找过程中的左右方向,当然了,如书中所说,向左则用0,向右则用1。因此该函数可以如下列出。我们先来写那个检测错误的谓词。(define(sym
NoMasp
·
2015-03-05 10:00
tree
encode
导入
define
symbol
【
SICP
练习】93 练习2.66
练习2.66这道题相当于二叉树在实际工程中的一个运用,我们依旧要用到前面所学到的三个过程:entry,left-branch,right-branch。这三者的作用分别是取出结点、左分支、右分支。而根据题目要求,这里还需要一个获取键值的key。当然了,就像书中上文所展示的那样,key并不需要我们写出来,这里就用到了按愿望思维。(define(lookupgiven-keytree-of-recor
NoMasp
·
2015-03-05 10:00
二叉树
tree
define
entry
键值
【
SICP
练习】92 练习2.65
练习2.65最后一道题了,来个总结倒是很不错。要完成两个函数,我们就要用到前面所学,首先用练习2.63中的函数将树变成表,这样有利于后续的处理,而根据前面的习题,用tree->list-2会更加快速。然后要实现并集或补集的功能,也要用到第104页相关的函数。题目要求的是平衡二叉树,因此还要用到练习2.64中的list->tree函数将最后的结果平衡。这三个函数的复杂度都出奇的一致为n,因此最终的函
NoMasp
·
2015-03-05 10:00
list
tree
二叉树
【
SICP
练习】91 练习2.64
练习2.64一开始list->tree会调用partial-tree,而后者会将每次传入的表分成两部分,然后组合成一个平衡树。中间运用了迭代的技巧,而这是让众多树枝产生的源泉。如果我们对前面的表’(1357911)做计算,返回的结果将会是:(5(1()(3()()))(9(7()())(11()())))其中的空表则表示的左、右没有子树。画出产生的树我就不再这里列出了,最终结果和图2-16中的最后
NoMasp
·
2015-03-05 10:00
组合
list
tree
调用
partial
【
SICP
练习】90 练习2.63
练习2.63这两段代码的区别在于第二段用了迭代,相信可以大大减少计算时间。那么还是先来测试第一小题。需要的代码大家先敲进去。然后来定义图2-16中的三棵树了。(definetree-1(make-tree7(make-tree3(make-tree1'()'())(make-tree5'()'()))(make-tree9(make-tree'())(make-tree11'()'())))) (
NoMasp
·
2015-03-05 10:00
代码
测试
tree
图
define
【
SICP
练习】89 练习2.62
练习2.62前面已经遇到过了,union-set是用来取并集的。我们要通过多种情况来完成这个程序。(define(union-setset1set2)(cond((and(null?set1)(null?set2))'())((null?set1)set2)((null?set2)set1)(else(let((x(carset1))(y(carset2)))(cond((=xy)(consx(u
NoMasp
·
2015-03-05 10:00
UNION
set
程序
define
cond
【
SICP
练习】88 练习2.60
练习2.60这里的adjoin-set通过遍历后使用cons将表进行不断的组合,并在组合的过程中将x加到集合中去。(define(adjoin-setxset)(if(null?set)(listx)(let((current-element(carset))(remain-element(cdrset)))(cond((=xcurrent-element)set)((>xcurrent-elem
NoMasp
·
2015-03-05 10:00
SICP
define
【
SICP
练习】86 练习2.58
练习2.58如果要由前序变成中序那就要有些大变动了。(define(make-suma1a2)(cond((=number?a10)a2)((=number?a20)a1)((and(number?a1)(number?a2))(+a1a2))(else(lista1‘+a2)))) (define(sum?x)(and(pair?x)(eq?(cadrx)‘+))) (define(addend
NoMasp
·
2015-03-05 10:00
SUM
number
define
a1
a2
【
SICP
练习】87 练习2.59
练习2.59我们可以采用迭代来完成这个过程,至于怎么迭代的,接下来就是代码了。(define(union-setset1set2)(define(union-set-iterset1set2)(if(null?input)(reverseresult)(let((current-element(carinput))(remain-element(cdrinput))(if(element-of-s
NoMasp
·
2015-03-05 10:00
set
element
SICP
reverse
car
【
SICP
练习】85 练习2.57
练习2.57看到题目中的能处理任意项就赶紧这道题挺难的,同时也想到了前面学过但还没怎么用过的点参数。题目中要能求和还能求乘积。我们先来写求和的函数吧。(define(make-suma1.a2)(if(single-operand?a2)(let((a2(cara2)))(cond((=number?a10)a2)((=number?a20)a1)((and(number?a1)(number?a
NoMasp
·
2015-03-05 10:00
参数
single
define
car
a1
SICP
习题 (2.26)解题总结:列表操作符append cons list
SICP
习题2.26也是不需要太多解释的题目,题目的主要目的是让读者理解appendconslist三个操作的差别。
keyboardOTA
·
2015-03-02 23:00
SICP
习题 (2.25)解题总结:列表的操作
SICP
习题2.25简单到不用解释题目要求我们使用car和cdr操作获得以下列表中的7:'(13(57)9) '((7)) '(1(2(3(4(5(67))))))各位同学搞清楚car和cdr就可以简单完成了
keyboardOTA
·
2015-03-02 23:00
Qt5官方demo解析集36——Wiggly Example
本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873接上文Qt5官方demo解析集35——Mu
sicP
layer
u011348999
·
2015-03-02 19:00
player
Music
qt5
QBasicTimer
Wiggly
QFontMetrics
【
SICP
练习】61 练习2.31-2.32
练习2.31我想说我已经越来越喜欢抽象了,将上一题中的map版本的square-tree抽象的方法是添加一个参数f,f是一个函数,因此将square替换成f即可。如下。(define(map-treeftree) (map(lambda(sub-tree) (if(pair?sub-tree) (tree-mapfsub-tree)
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】60 练习2.30
练习2.30如果这道题感觉有点难度的话,可以回过头来看看75页定义的两个scale-tree。我的定义如下:(define(square-treetree) (cond((null?tree)‘()) ((not(pair?tree))(squaretree)) (else(cons(square-tree(cartree))
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】58 练习2.28
练习2.28这道题是要我们找出树的所有树叶,参考第73页下面的count-leaves,当遍历这个树的时候也会有这三种情况:元素为空,元素不成对,以及元素成对。根据这个关系可以写出fringe如下:(define(fringetree) (cond((null?tree)‘()) ((not(pair?tree))(listtree)) (else(appe
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】59 练习2.29
练习2.29这种题,还有之前的那个rectangle的题目,对于变量、函数等的命名简直要让人疯掉。先来写出题目中的left-branch和right-branch吧。(define(left-branchmobile) (carmobile))(define(right-branchmobile) (cadrmobile))注意这里是cadr而不是cdr。对应的branch-lengt
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】57 练习2.27
练习2.27又是修改程序的题目,要求我们写出的deep-reverse函数要将表中的元素也反转过来,这其中应该要用到递归来实现吧。(define(deep-reversetree) (cond((null?tree)‘()) ((not(pair?tree))tree) (else(reverse(list(deep-reverse(cartree))
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】55 练习2.23
练习2.23这道题就有小小的难度了。(define(for-eachflst) (cond((not(null?lst)) (f(carlst)) (for-eachf(cdrlst)))))如果用上前面经常用到的begin和if,这里还有另一种for-each实现。(define(for-eachflst) (if(not(null?lst))
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】56 练习2.24-2.26
练习2.24其打印结果为:(1(2(34))) 练习2.25(definex‘(13(57)9))(cadr(caddrx));Value:7(definey‘((7)))(caary);Value:7(definez‘(1(2(3(4(5(67)))))))(cadr(cadr(cadr(cadr(cadr(cadrz))))));Value:7 练习2.26(definex(list123
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】54 练习2.22
练习2.22题目中Louis的第一个程序将items中的元素一个一个的取出来然后平方然后”推“到answer中。而我们在上一题中则是迭代结构,是将元素平方后”推“到一个大盒子中,而大盒子里又有一个元素被平方然后被”推“到另一个稍微小点的大盒子中去。而修改后的程序看似解决了问题,其实错得更加离谱了。比如用(list12345)作为items一开始传入,程序先将1取出来平方,然后推到最前面,但是其
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】53 练习2.21
练习2.21如果在看
SICP
这本书之前做过其他准备工作,或者看过我的【Scheme归纳】那几篇文章,那这些题都是小case了。
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】52 练习2.20
练习2.20如果读懂了题目的意思这道题也是不难的,重点就是带点尾部记法形式的define。下面我们就来写出same-parity过程。(define(same-parityfist.other) (filter(if(even?fist) even? odd?) (consfirstother)))最巧妙地地方就在于用cons
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】51 练习2.19
练习2.19这道题的题目比较长,但是难度却不大的。无非就是用cons、car、cdr等等,就像前面的矩形啊点啊什么的。(define(first-denominationcoin-values) (carcoin-values))(define(except-first-denominationcoin-values) (cdrcoin-values))(define(no-more?
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】50 练习2.18
练习2.18这道题也不难,通过迭代来完成。不过我想整个过程,无论是两个define还是一个define,都只用一个参数,但还为完成,希望有谁会的在博文下面评论咯。(define(reverselist) (reverse-iterlist‘()))(define(reverse-iterlistother) (if(null?list) other (reverse
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】49 练习2.17
练习2.17这道题就比较简单了,直接可以写出如下:(define(last-pairlist) (if(null?(cdrlist)) list (last-pair(cdrlist))))
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】47 练习2.6
练习2.6如果这道题还没有做的请务必要先自己思考并检验。如果没有能够求出来,也可以在看完我推导的one之后自己再来推导two。一开始我也不懂题目中的两个式子是什么意思,甚至连怎么用都不知道。但我猜测到是不是可以用这两个式子来构造出one,以及two,还有后面的无数多个。既然有了想法,那么就开工吧。我把在Edwin中写的截图下来,因为Edwin会自动缩进比较直观,比word好用些。同样的,two可以
NoMasp
·
2015-02-22 13:00
SICP
【
SICP
练习】46 练习2.5
练习2.5这道题的意思是有一个新的cons,其接受两个参数a、b,并且返回(2^a)*(3^b)。这个比较容易实现了。(define(consab) (*(expt2a)(expt3b)))(cons22);Value:36根据题中的意思,并将其与car和cdr类比,得知car是要分离出2^a,cdr是要分离出3^b。(define(carx) (if(=0(remainderx2))
NoMasp
·
2015-02-17 20:00
SICP
【
SICP
练习】44 练习2.3
练习2.3我们并不必急于写出点什么,先来回过头看看书吧。第56页说到了一种称为按愿望思维的强有力的综合策略。在这道题里,我们就可以假设已经写好了能够表示矩形的代码,以及能够求矩形长和宽的函数。于是像先定义出add-rat一样,我们先定义出求矩形的周长和面机的函数。(define(get-perimeterx)(let((length(rectangle-lengthx)) (width(
NoMasp
·
2015-02-17 20:00
SICP
【
SICP
练习】45 练习2.4
练习2.4直接运用对比的技巧就可以猜测出相应的cdr表示如下:(define(cdrz) (z(lambda(pq)q)))但我们还是要按照题中要求用代换模型来检验。先来检验car的。(car(cons01))(car(lambda(m)(01)))((lambda(z)(z(lambda(pq)p))) (lambda(m)(01)))((lambda(m)(01))(lambda(p
NoMasp
·
2015-02-17 20:00
SICP
【
SICP
练习】43 练习2.2
练习2.2(define(make-segmentstart-pointend-point)(consstart-pointend-point))(define(start-segmentseg)(carseg))(define(start-segmentseg) (cdrseg))(define(make-pointxy) (consxy))(define(x-pointp)
NoMasp
·
2015-02-17 20:00
SICP
【
SICP
练习】42 练习2.1
练习2.1我们已经进入了新的一章,这本书还是蛮会循序渐进的嘛,第一题挺简单的。(define(make-ratnd) (let((g(gcdnd))) (if(<d0) (cons(-(/ng))(-(/dg))) (consnd))))
NoMasp
·
2015-02-17 20:00
SICP
【
SICP
练习】40 练习1.45
练习1.45如果看到前面的文章,应该知道我喜欢将某个变量n先设成一个固定的数比如3、4什么的。这里我们依旧如此,先来看看如何写出开四次方根的过程。这道题的目的旨在让我们好好回顾前面的内容,毕竟只剩下一道题我们就完完全全的解决了第一章。下面我来带大家一起回顾一下。fixed-point是以1个函数和一个初始猜测为参数的函数,用来计算不动点。所谓的不动点就是x=f(x)时的点x。比如这个式子,(f
NoMasp
·
2015-02-17 20:00
SICP
上一页
37
38
39
40
41
42
43
44
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他