SICP习题解答2.1-2.6
来源:互联网 发布:文明6 mac下载 编辑:程序博客网 时间:2024/04/30 13:20
ex2.1-2.4
#lang racket; exercise 2.1(define (make-rat n d) (define g (gcd n d)) (let ((g1 (if (< d 0) (- g) g))) (cons (/ n g1) (/ d g1))))(define (gcd a b) ;; 返回正最大公约数 (if (= b 0) (if (< a 0) (- a) a) (gcd b (remainder a b)))); exercise 2.2(define (make-segment s e) (cons s e))(define (start-segment seg) (car seg))(define (end-segment seg) (cdr seg))(define (make-point x y) (cons x y))(define (x-point p) (car p))(define (y-point p) (cdr p))(define (midpoint-segment seg) (let ((a (start-segment seg)) (b (end-segment seg))) (make-point (/ (+ (x-point a) (x-point b)) 2) (/ (+ (y-point a) (y-point b)) 2))))(define (print-point p) (newline) (display "(") (display (x-point p)) (display ",") (display (y-point p)) (display ")"))(print-point (midpoint-segment (make-segment (make-point 32 21) (make-point 45 10)))); exercise 2.3;; 假设矩形的边平行于坐标轴,然后用左下点+右上点确定一个矩形(define (make-rect left-bottom right-top) (cons left-bottom right-top))(define (left-bottom rect) (car rect))(define (right-top rect) (cdr rect))(define (width-rect rect) (- (x-point (right-top rect)) (x-point (left-bottom rect))))(define (height-rect rect) (- (y-point (right-top rect)) (y-point (left-bottom rect))))(define (perimeter-rect rect) (* (+ (width-rect rect) (height-rect rect)) 2))(define (area-rect rect) (* (width-rect rect) (height-rect rect)))(define r (make-rect (make-point 1 2) (make-point 3 6)))(perimeter-rect r)(area-rect r);; 其他定义一个矩形方法有很多,例如左下点+长宽等; exercise 2.4(define (cdr z) (z (lambda (p q) q)))
ex2.5
#lang racket; exercise 2.5(define (cons a b) (* (pow 2 a) (pow 3 b)))(define (car x) (f x 2))(define (cdr x) (f x 3))(define (pow base exp) (define (iter cur res) (if (= 0 cur) res (iter (- cur 1) (* base res)))) (iter exp 1))(define (f x base) (define (iter res) (if (= 0 (remainder x (pow base res))) (iter (+ res 1)) (- res 1))) (iter 1))(define x (cons 4 6)) (car x) (cdr x)
ex2.6
这题是关于Church计数,首先我们来看一下维基百科上的定义:
---------------------------------我-----------是--------分---------割----------线----------------------------------------------
- 0 ≡
λf.λx. x
- 1 ≡
λf.λx. f x
- 2 ≡
λf.λx. f (f x)
- 3 ≡
λf.λx. f (f (f x))
- ...
- n ≡
λf.λx. fn x
- ...
就是说,自然数 被表示为 Church 数n,它对于任何 lambda-项F
和 X
有着性质:
- n
F X
=βFn X
。
---------------------------------我-----------是--------分---------割----------线----------------------------------------------
按照我的理解是:0代表函数f在变量x上作用0次,1代表函数f在变量x上作用1次,... ... ,n代表函数f在变量x上作用n次;其中函数f和变量x是用户自己定义的。上述等式左边代表特殊的0~n(其实他们是函数,需要知道f, x才能求值,也就是需要传入2个参数)
例如我们可以定义x=0,f(x)=x+1,那么等式左边的0~n求值后就对应自然数中的0~n
另外Church计数还定义了如下操作:
---------------------------------我-----------是--------分---------割----------线----------------------------------------------
加法函数 利用了恒等式。
- plus ≡
λm.λn.λf.λx. m f (n f x)
后继函数 β-等价于 (plus 1)。
- succ ≡
λn.λf.λx. f (n f x)
乘法函数 利用了恒等式。
- mult ≡
λm.λn.λf. n (m f)
指数函数 由 Church 数定义直接给出。
- exp ≡
λm.λn. n m
有了上面这些知识,这题就比较容易理解了。这题给出了0和后继函数succ的定义,让我们求1,2,plus的定义。
已知0和后继函数succ的定义:
(define zero (lambda (f) (lambda (x) x)))(define (add-1 n) ;; (lambda (f) (lambda (x) (f ((n f) x)))))从上面的定义上我们可以看出:zero是一个函数(包含一个参数),它返回一个identity函数(即本身);也就是说函数f在变量x上作用了0次,即直接返回x的值。
例如我们可以进行如下的调用((zero f) 100),其中f可以为任意函数,那么这个表达式的值为100
根据上面的2个定义,我们可以进行如下推到:
one
= add-1 zero
= lambda (f) (lambda (x) (f ((zero f) x)))
= lambda (f) (lambda (x) (f ((lambda (x) x) x)))
= lambda (f) (lambda (x) (f x))
因而one定义如下:
(define one (lambda (f) (lambda (x) (f x))))two
= add-1 one
= lambda (f) (lambda (x) (f ((one f) x)))
= lambda (f) (lambda (x) (f ((lambda (x) (f x)) x)))
= lambda (f) (lambda (x) (f (f x)))
因而two定义如下:
(define two (lambda (f) (lambda (x) (f (f x)))))
从而我们可以推出n的定义:
(define n (lambda (f) (lambda (x) (f (f ... f (x))))))上面的f调用了n次,当然这个写法不规范,但是我们可以这样认为。
我们在使用n这个函数的时候可以这样调用:((n f) x),其中f, x可以由用户定义,它的值就是f(...f(x)...)
下面我们来解决加法问题。
(add m n)可以认为对变量n调用了m次add-1函数
调用1次add-1:
(lambda (f) (lambda (x) (f ((n f) x))))
即
(lambda (f) (lambda (x) ((one f) ((n f) x))))
调用2次add-1:
(lambda (f) (lambda (x) (f (f((n f) x)))))即
(lambda (f) (lambda (x) ((two f) ((n f) x))))....
....
调用m次add-1:
(lambda (f) (lambda (x) (f...((n f) x))))也就是:
(lambda (f) (lambda (x) ((m f) ((n f) x))))因而有如下定义:
(define (add m n) (lambda (f) (lambda (x) ((m f) ((n f) x)))))
- SICP习题解答2.1-2.6
- SICP习题1.6的解答
- SICP习题解答1.1-1.8
- SICP习题解答1.9-1.19
- SICP习题解答1.20-1.28
- SICP习题解答1.29-1.39
- SICP习题解答1.40-1.46
- SICP习题解答2.7-2.16
- SICP习题解答2.17-2.23
- sicp习题2.1
- SICP第一章及第二章部分习题解答
- SICP习题
- SICP 习题2.6之丘奇数
- SICP 习题2.6 丘奇计数
- SICP 第二章第一节 习题 2.1-2.16
- 习题解答
- 习题解答
- sicp 第一章习题试做
- python2.7.1编码问题
- VMware Linux安装RAC出现Failure at final check of Oracle CRS stack 10的解决
- 【Android】屏幕适配——屏幕规格与分辨率对照表
- Fermat素性测试, Miller-Rabin素性测试
- C语言代码优化
- SICP习题解答2.1-2.6
- IOS开发中的UIScreen、UIView、UIWindow和UIViewController
- epoll为什么快 及和select区别
- linux线程(一)
- 反汇编算法介绍和应用——线性扫描算法分析
- 数据库中的NULL 在mfc界面中显示的结果
- 使用dx9sdk为vs2008 搭建directx环境
- poj 3304
- AndEngine中TextureOptions的区别