我正在尝试通过SICP学习计划.练习1.3内容如下:定义一个过程,该过程将三个数字作为参数,并返回两个较大数字的平方和.请评论我如何改进我的解决方案.
(define (big x y)
    (if (> x y) x y))
(define (p a b c)
    (cond ((> a b) (+ (square a) (square (big b c))))
          (else (+ (square b) (square (big a c))))))
作为我自己的练习,我正在实施Miller-Rabin测试.(通过SICP工作).我理解费马的小定理并且能够成功地实现它.我在米勒 - 拉宾测试中被绊倒的部分是这个"1 mod n"业务.是不是1 mod n(n是一些随机整数)总是1?所以我很困惑"1模数n的非平方根"可能是什么,因为在我看来"1 mod n"在处理整数值时总是1.我错过了什么?
我正在通过SICP工作,问题2.6让我陷入了困境.在处理教会数字时,将零和1编码为满足某些公理的任意函数的概念似乎是有意义的.另外,使用零的定义导出单个数字的直接公式,并且add-1函数是有意义的.我不明白如何形成一个加号运算符.
到目前为止,我有这个.
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))
(define one (lambda (f) (lambda (x) (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))
通过wikipedia条目查看lambda演算,我发现plus的定义是PLUS:=λmnfx.mf(nfx).使用该定义,我能够制定以下程序.
(define (plus n m)
  (lambda (f) (lambda (x) ((m f) ((n f) x)))))
我不明白的是,如何仅使用先前派生的程序给出的信息直接导出该过程.任何人都可以用某种严格的证明形式回答这个问题吗?直觉上,我想我明白发生了什么,但正如Richard Feynman曾经说过的那样,"如果我不能建造它,我就无法理解......"
我有一些python的经验,我要求一种新的语言,并说我很难实现我学到的东西.他们建议我学习SICP.说它使用一种优秀的语言,并教授优秀的编程基础知识.
但我注意到它是在1984年出版的.你们推荐它们,还是我被拖了?:p
谢谢.
这是来自SICP的书,我相信很多人都熟悉这本书.这是本书的早期例子,但我觉得这是一个非常重要的概念,我无法理解.这里是:
(define (cons x y)
 (define (dispatch m)
   (cond ((= m 0) x)
         ((= m 1) y)
         (else (error "Argument not 0 or 1 - CONS" m))))
 dispatch)
(define (car z) (z 0))
(define (cdr z) (z 1))
所以在这里我理解car并且cdr正在定义范围内cons,并且我得到它们分别将一些参数映射z到1和0(参数z是一些cons).但是我说我打电话(cons 3 4)......当我们立即进入这个内部过程dispatch并且m我们还没有指定一些参数时,如何评估参数3和4 ?而且,更重要的是,返回的重点是dispatch什么?我根本没有真正得到那个部分.任何帮助表示赞赏,谢谢!
我正在经历SICP,我希望有一个类似于交互式Python解释器的翻译,在我看课和阅读本书时可以玩.此外,我希望这个解释器在Emacs中运行,这样我就可以在方案代码和交互式解释器等文件之间来回切换.
但是,我对Emacs相当新,并且还没有能够让它工作或者找到一套明确的指令来使它工作.
似乎我应该能够设置它以便M-x run-scheme打开一个至少听起来就像我想要的交互式解释器,但此刻这只是返回Searching for program: no such file or directory, scheme而且我无法弄清楚究竟是什么文件我需要在哪里解决这个问题.
我正在GNU Emacs 22.1.1 (mac-apple-darwin, Carbon Version 1.6.0)通过OS X 10.5安装DVD安装.
据我所知,急切评估/应用顺序在应用之前评估函数的所有参数,另一方面,惰性评估/正常顺序仅在需要时评估参数.
那么,热切评估和应用顺序,懒惰评估和正常秩序这两个术语之间有什么区别?
谢谢.
当我在SICP中遇到以下'替代'定义的缺点和汽车时,我才开始觉得我对球拍和方案中lambda的使用有一个模糊的理解
(define (cons x y)
   (lambda (m) (m x y)))
(define (car z)
  (z (lambda (p q) p)))
(define (cdr z)
  (z (lambda (p q) q)))
对于我的生活,我无法解析它们.
任何人都能解释如何以对全新手有意义的方式解析或扩展这些吗?
我试图在SICP中进行2.78运动,但是函数put和get是未知的.我尝试了多种语言,如相当大,球拍,r5rs,mit-scheme,mzscheme等.我甚至下载了SICP支持(http://www.neilvandyke.org/sicp-plt/),但无济于事.我怎样才能使这些功能起作用?
sicp ×10
scheme ×7
algorithm ×1
emacs ×1
evaluation ×1
interpreter ×1
lambda ×1
lisp ×1
macos ×1
primes ×1
racket ×1
terminology ×1