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
归纳】3 层次性数据和符号数据
后来才知道让Lisp输出图形化界面是更高层次的工程,想想还是先把
SICP
搞定。上一篇博文中我们谈到了复合数据,关于它有两个重点。第一,数据抽象,这也就意味
NoMasp
·
2015-09-08 21:00
数据
闭包
抽象
层次
元语言
【
SICP
练习】74 练习2.45
练习2.45我们先将right-split和up-split抽象出一个split来。(define(splitbig-combinersmall-combiner) (lambda(paintern) (if(=n0) painter (let((smaller((splitbig-combinersmall-combiner)painter
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】25 练习1.31
练习1.31题目中已经说的很清楚了,product用来返回在给定范围中各点的某个函数值的乘积。我们惊奇的发现这和前面的sum有着很大的相似,无非是将加法换成了乘法:(define(producttermanextb) (if(>ab) 1 (*(terma) (productterm(nexta)nextb))))既然在上一道习题中已经得出了sum的迭代版
NoMasp
·
2015-09-08 21:00
SICP
real-time-clock
【
SICP
归纳】2 高阶函数和数据抽象
上一篇博文对应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么。书中展示了很多有趣的句法(syntax)。现在我们要让思想进一步的抽象,写这篇博客的时候并未学完整本书,更不敢说对书中的内容有一个多深的领悟。但我一路学习过来,就感觉书中的示例越来越抽象,作者所引导我们的也是如此方向。博文也会持续更新下去,伴随着我的理解。在这个专栏的【Scheme归纳】4高阶函数中已经初步介绍了什么
NoMasp
·
2015-09-08 21:00
SICP
lisp
syntax
高阶函数
数据抽象
【
SICP
练习】92 练习2.65
练习2.65最后一道题了,来个总结倒是很不错。要完成两个函数,我们就要用到前面所学,首先用练习2.63中的函数将树变成表,这样有利于后续的处理,而根据前面的习题,用tree->list-2会更加快速。然后要实现并集或补集的功能,也要用到第104页相关的函数。题目要求的是平衡二叉树,因此还要用到练习2.64中的list->tree函数将最后的结果平衡。这三个函数的复杂度都出奇的一致为n,因此最终的函
NoMasp
·
2015-09-08 21:00
list
tree
二叉树
【
SICP
练习】38 练习1.43
练习1.43我不想一开始就将结果贴出啦,而是通过叙述自己的思考来完成这篇博客。上一题中我在纸上写下“传入2个过程并返回1个过程”,事实证明挺有效的,于是这次我也依旧这么做了。repeated需要传入一个过程和一个数字,这个数字决定了这个过程的执行次数。repeated还要返回1个过程,而这个过程又要传入一个数字,这个数字又将通过前面传入的过程来运算。确实挺绕的。一开始对于决定这个过程的执行次数
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】128 练习3.59
练习3-59原文代码a)(define(integrate-seriess)(stream-map*(stream-map/onesintegers)s))b)(definesine-series(cons-stream0(integrate-seriescosine-series))) (definecosine-series(cons-stream1(integrate-series(scal
NoMasp
·
2015-09-08 21:00
Stream
map
define
num
series
【
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-09-08 21: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-09-08 21:00
SICP
【
SICP
练习】62 练习2.33
练习2.33既然要用到accumulate,那么我们先来回顾一下这个函数好了。其有三个参数,一个操作符,一个用来作为初始化的值,一个是需要运算的序列。题目中的map已有的定义如下:(define(mappsequence) (accumulate(lambda(xy)) nil sequence))这里的nil也是’(),其作为a
NoMasp
·
2015-09-08 21:00
SICP
【
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-09-08 21:00
二叉树
tree
define
entry
键值
【
SICP
练习】3 练习1.7
练习1.7这道题回应了第15页所说的good-enough?并不是一个很好的检测方法。我们首先来按照题目要求用4组最大或最小的数来检测原文中的good-enough?(sqrt-iter1.00.00000081) 0.0009;Value:0.3125863108711088(sqrt-iter1.00.000000014) 0.00012;V
NoMasp
·
2015-09-08 21:00
测试
lambda
character
lisp
let
【
SICP
练习】16 练习1.22
练习1.22这道题中需要判断素数的部分书中都已经列出来了,但要求是要找出多个素数,因此我们要有一个能够不断求素数的函数。在C等语言中我们可以通过一个for循环来轻易地求出来,在Scheme中我们完全可以用迭代来实现这一功能。另外因为是要的素数,因此完全不用考虑偶数了。于是我们先来写一个不断求奇数的函数。(define(odd-after-xx) (if(odd?x) (
NoMasp
·
2015-09-08 21:00
Scheme
SICP
lisp
Square
Numbers
【
SICP
练习】82 练习2.54
这些关于Scheme的基本知识在【Scheme归纳】系列博文总都有介绍。(define(equal?xy)(cond((and(symbol?x)(symbol?y))(symbol-equal?xy))((and(list?x)(list?y))(list-equal?xy))(else(error“Error:Youjustinputwrongtype.”))(define(symbol-eq
NoMasp
·
2015-09-08 21:00
list
define
symbol
sicily
cond
【
SICP
练习】152 练习4.8
练习4-8原文Exercise4.8.“Namedlet”isavariantofletthathastheform(let)Theandarejustasinordinarylet,exceptthatisboundwithintoaprocedurewhosebodyisandwhoseparametersarethevariablesinthe.Thus,onecanrepeatedlyex
NoMasp
·
2015-09-08 21:00
procedure
lambda
SICP
lisp
eval
【
SICP
练习】146 练习4.2
练习4-2原文Exercise4.2.LouisReasonerplanstoreorderthecondclausesinevalsothattheclauseforprocedureapplicationsappearsbeforetheclauseforassignments.Hearguesthatthiswillmaketheinterpretermoreefficient:Sincep
NoMasp
·
2015-09-08 21:00
BEFORE
for
eval
cond
applications
【
SICP
练习】52 练习2.20
练习2.20如果读懂了题目的意思这道题也是不难的,重点就是带点尾部记法形式的define。下面我们就来写出same-parity过程。(define(same-parityfist.other) (filter(if(even?fist) even? odd?) (consfirstother)))最巧妙地地方就在于用cons
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】72 练习2.43
练习2.43因为对于(enumerate-interval1board-size),Louis的过程会产生(queen-cols(-k1))个棋盘,而上一练习中给出的代码则只产生board-size个棋盘。上一练习中,如果board-size为8,则会产生行列均为1、2……8的8个棋盘。版权声明:本文为NoMasp柯于旺原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.cs
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】130 练习3.61
练习3-61原文代码(define(reciprocal-seriess)(cons-stream1(scale-stream(mul-series(stream-cdrs)(reciprocal-seriess))-1)))感谢访问,希望对您有所帮助。欢迎关注或收藏、评论或点赞。为使本文得到斧正和提问,转载请注明出处:http://blog.csdn.net/nomasp版权声明:本文为NoMa
NoMasp
·
2015-09-08 21:00
Stream
scale
define
series
【
SICP
练习】8 练习1.12
这道练习的翻译有误。原文是:WriteaprocedurethatcomputeselementsofPascal’strianglebymeansofarecursiveprocess.正确的翻译应该是计算帕斯卡三角形的各个元素。y:0 11 1 12 1 2 13 1 3 3 14 1 4 6 4 15x: 0 1 2 3 4 如果用x代表帕斯卡三角形中列的
NoMasp
·
2015-09-08 21:00
递归
栈
迭代
SICP
pascal
【
SICP
练习】124 练习3.55
练习3-55原文Exercise3.55.Defineaprocedurepartial-sumsthattakesasargumentastreamSandreturnsthestreamwhoseelementsareS0,S0+S1,S0+S1+S2,….Forexample,(partial-sumsintegers)shouldbethestream1,3,6,10,15,….代码(de
NoMasp
·
2015-09-08 21:00
Stream
for
sh
Argument
define
【
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-09-08 21:00
SICP
【
SICP
练习】68 练习2.39
练习2.39通过前一习题的类比相信已经知道了fold-left和fold-right的内在意义,本题中要求的逆序数可以用cons来构造。具体为,先将list的第一个元素取出用(cons(carlist)‘())构造,接着第二个、第三个……用(cons……(cons(car(carlist))(cons(carlist)‘())))。当然了,在这个递归的过程中我们并不需要(car(carlist
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】107 练习3.8
练习3-8原文Exercise3.8.Whenwedefinedtheevaluationmodelinsection1.1.3,wesaidthatthefirststepinevaluatinganexpressionistoevaluateitssubexpressions.Butweneverspecifiedtheorderinwhichthesubexpressionsshouldbe
NoMasp
·
2015-09-08 21:00
Model
lambda
SICP
expression
evaluate
【
SICP
练习】95 练习2.68
练习2.68先要导入练习2.67中的sample-tree。这道题要求我们写出能够根据给定的树产生出给定符号的二进制位表的函数encode-symbol,这个函数还要能够在遇到未在树中出现的符号时报错。这个函数将要在给定的树中查找给定符号的叶子节点,并记录下寻找过程中的左右方向,当然了,如书中所说,向左则用0,向右则用1。因此该函数可以如下列出。我们先来写那个检测错误的谓词。(define(sym
NoMasp
·
2015-09-08 21:00
tree
encode
导入
define
symbol
【
SICP
练习】65 练习2.36
练习2.36虽然accumulate正在变得越来越复杂,但我还并未完全领悟到它的深刻意义。不过直觉告诉对于序列的序列,我们要做的是依次取出它每个序列的第一个元素。此方法来源于网络,我一直都是想着用lambda来写,最后感觉太复杂了。没想到一个map就解决了问题。Lisp中的高阶函数果然不仅仅是函数那么简单,它能做的真是太多了。抽象也不是一般的抽象。简简单单的一个(mapcarseqs)便能把序
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】101 练习2.77-2.78
练习2.77我们首先来看看题目中描述的问题,当LouisReasoner试着求值(magnitudez)时,程序中不断的寻找。一开始是通过apply-generic、而后是map,最后是get。这三个函数在书中都有很好的解释,我自知才疏学浅就不介绍了。最后一步的get中,最后由于找不到匹配的参数而返回了#f。而在Alyssa的程序中则不然。具体请看代码。(define(install-rectan
NoMasp
·
2015-09-08 21:00
参数
Install
apply
generic
define
【
SICP
练习】70 练习2.41
练习2.41这道题其实就是书中素数示例的变种,其本质是一样的。因此我们也按照同样的次序来完成这个过程。首先第一步,我们来完成生成3个相异整数构成的三元组。但在上一题中我们已经写出了能够产生2个相异整数构成的二元组了。因此我们只要多产生一个i,让其与产生的二元组结合,便能产生三元组了。那么,开工吧。(define(unique-triplesn) (flatmap(lambda(i)
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】47 练习2.6
练习2.6如果这道题还没有做的请务必要先自己思考并检验。如果没有能够求出来,也可以在看完我推导的one之后自己再来推导two。一开始我也不懂题目中的两个式子是什么意思,甚至连怎么用都不知道。但我猜测到是不是可以用这两个式子来构造出one,以及two,还有后面的无数多个。既然有了想法,那么就开工吧。我把在Edwin中写的截图下来,因为Edwin会自动缩进比较直观,比word好用些。同样的,two可以
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】142 练习3.77
练习3-77原文Exercise3.77.Theintegralprocedureusedabovewasanalogoustothe“implicit”definitionoftheinfinitestreamofintegersinsection3.5.2.Alternatively,wecangiveadefinitionofintegralthatismorelikeintegers-st
NoMasp
·
2015-09-08 21:00
Stream
procedure
section
Definition
infinite
【
SICP
练习】67 练习2.38
练习2.38这道题比较有意思了,我们先来将fold-left和accumulate类比,accumulate是递归,而fold-left是迭代。前者通过不断地将(opresult(carrest)变换成initial,通过将(cdrrest)变换成sequence,而rest一开始其实就是sequence,result一开始则是initial。result——(opresult(carrest
NoMasp
·
2015-09-08 21:00
SICP
【
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-09-08 21:00
Install
apply
操作
generic
define
【
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-09-08 21:00
SICP
【
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-09-08 21:00
element
set
SICP
reverse
car
【
SICP
练习】121 练习3.52
练习3-52原文Exercise3.52.Considerthesequenceofexpressions(definesum0) (define(accumx)(set!sum(+xsum))sum) (defineseq(stream-mapaccum(stream-enumerate-interval120))) (definey(stream-filtereven?seq)) (def
NoMasp
·
2015-09-08 21:00
Stream
set
sequence
define
interval
【
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-09-08 21:00
SICP
【
SICP
练习】48 练习:2.7-2.16【待添加】
待添加版权声明:本文为NoMasp柯于旺原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】136 练习3.67
练习3-67原文Exercise3.67.Modifythepairsproceduresothat(pairsintegersintegers)willproducethestreamofallpairsofintegers(i,j)(withouttheconditioni
NoMasp
·
2015-09-08 21:00
Stream
Condition
procedure
hint
pairs
【
SICP
练习】23 练习1.29
练习1.29这道题的数学气息比较浓厚。像变量h和函数y在书中已经有了定义,并且n是偶数。另外通过观察我们发现当k等于0或者n时,y的系数为1;当k为偶数时,y的系数为2;当k为奇数时(在函数中直接用else也可以),y的系数为4。根据书中前面的讲解,需要有一个term作用在a上,还要有一个next来产生下一个a值。下面我们依次来完成这5个部分。(defineh(/(-ba)n))我曾将这一部分
NoMasp
·
2015-09-08 21:00
Scheme
SICP
【
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+a(p+q))
NoMasp
·
2015-09-08 21:00
Scheme
测试
迭代
SICP
lisp
我的CSDN生涯
2015.4.6)访问仅9346次2015年时间事件2月3日新开通CSDN博客,并进行博客搬家2月10日博客专栏的申请审核通过3月23日积分1500分,排名125653月25日日访问量突破8003月月底专栏:
SICP
NoMasp
·
2015-09-08 21:00
csdn
CSDN博客
【
SICP
练习】6 练习1.10
我们先将Ackermann函数写入Edwin中,当然了,再获取结果之前应该先自己用笔算算。结果如下:(A110);Value:1024(A24);Value:65536(A33);Value:65536其中65536也就是16的四次方。接下来通过连续的n值来观察题目中随后给出的几个过程。和之前一样,直接代入题目中所给的函数即可。(define(fn)(A0n)):n 0 1 2 3 4 5
NoMasp
·
2015-09-08 21:00
递归
Scheme
SICP
lisp
【
SICP
练习】131 练习3.62
练习3-62原文Exercise3.62.Usetheresultsofexercises3.60and3.61todefineaprocedurediv-seriesthatdividestwopowerseries.Div-seriesshouldworkforanytwoseries,providedthatthedenominatorseriesbeginswithanonzerocons
NoMasp
·
2015-09-08 21:00
div
for
power
define
series
【
SICP
练习】2 练习1.6
练习1.6这道题通过由一个新版本的if来引出,主要讨论的还是应用序和正则序的问题。我看到“将if提供为一种特殊形式”时还满头雾水,并不太清楚什么特殊形式。当再返回看if的语法时才发现,这在第12页if的一般表达式下面一段。如果得到真值,解释器就去求值并返回其值。注意,在此处已经返回其值了,并没有进行后续运算。而通过cond写出来的常规过程的if,在解释器采用应用序求值的情况下,如果第一次运算g
NoMasp
·
2015-09-08 21:00
lambda
正则
lisp
应用
let
【
SICP
练习】132 练习3.63
练习3-63原文Exercise3.63.LouisReasoneraskswhythesqrt-streamprocedurewasnotwritteninthefollowingmorestraightforwardway,withoutthelocalvariableguesses:(define(sqrt-streamx)(cons-stream1.0(stream-map(lambda(
NoMasp
·
2015-09-08 21:00
div
for
power
define
series
【
SICP
归纳】1 过程和代换模型
《计算机程序的构造和解释》这本书的目标并不是讲解一门编程语言的语法等,它是一种方法。不是在向你陈述知识,而是在教你如何做到想要做的东西。它是一个过程,一个精神。这些引导过程的东西就是所谓的程序规则的模式。书中用了许多的例子来诠释书名,我才疏学浅就不再举例往博客上推了,仅仅归纳一点总结而已。如果说程序是一种法术,那么控制神奇的法术就是过程。因此我们需要一门叫做Lisp的语言来唤醒这种精神。从书中的讲
NoMasp
·
2015-09-08 21:00
模式
编程语言
方法
表达式
控制
【
SICP
练习】29 练习1.35
练习1.35依旧是每一小节中比较简单的第一题,计算黄金分割率的过程如下:(defineget-golden-ratio(fixed-point(lambda(x)(+1(/1x)))1.0))虽然比较简单,但我们还是测试一下:get-golden-ratio;Value:1.6180327868852458版权声明:本文为NoMasp柯于旺原创文章,未经许可严禁转载!欢迎访问我的博客:http
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】40 练习1.45
练习1.45如果看到前面的文章,应该知道我喜欢将某个变量n先设成一个固定的数比如3、4什么的。这里我们依旧如此,先来看看如何写出开四次方根的过程。这道题的目的旨在让我们好好回顾前面的内容,毕竟只剩下一道题我们就完完全全的解决了第一章。下面我来带大家一起回顾一下。fixed-point是以1个函数和一个初始猜测为参数的函数,用来计算不动点。所谓的不动点就是x=f(x)时的点x。比如这个式子,(f
NoMasp
·
2015-09-08 21:00
SICP
【
SICP
练习】137 练习3.68
练习3-68原文Exercise3.68.LouisReasonerthinksthatbuildingastreamofpairsfromthreepartsisunnecessarilycomplicated.Insteadofseparatingthepair(S0,T0)fromtherestofthepairsinthefirstrow,heproposestoworkwiththewh
NoMasp
·
2015-09-08 21:00
Stream
REST
SICP
building
pairs
【
SICP
练习】112 练习3.28
练习3-28原文Exercise3.28.Defineanor-gateasaprimitivefunctionbox.Youror-gateconstructorshouldbesimilartoand-gate.代码(define(or-gateinput-1input-2output)(define(or-action-procedure)(let((new-value(logical-or
NoMasp
·
2015-09-08 21:00
代码
action
define
output
Primitive
上一页
33
34
35
36
37
38
39
40
下一页
按字母分类:
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
其他