SICP ex2-3 2-4 2-5(lambda calculus)

2-3要求解释
(define (cons x y)
	(lambda (m) (m x y)))
(define (car z)
	(z (lambda (p q) p)))

为什么 此处的(car (cons x y))能够正常运行给出解释

乍一看,这东西是什么鬼东西,一片迷茫,仔细一分析

我们将其展开

((lambda (m) (m x y)) (lambda (p q) p))

好像还是看不太懂

这里其实是把后面第二个lambda作为过程参数,传到第一个过程中

这样相当于x y就是第二个函数的参数了

所以,car返回第一个参数

类推,cdr只需将过程里的p改为q即可

(这里,我们把m改成 process可能会好点理解吧)


2-4

要求利用2^a*3^b创建一个序列对(a,b)用来表示非负数

这个比较简单直接给代码

(define (pwr b e)
	(define (iter count result)
		(if (= count e) result
		    (iter (+ count 1) (* result b))))
	(iter 0 1))
(define (cons a b)
	(* (pwr 2 a) (pwr 3 b)))
(define (reminder x y)
	(if (< x y) x (reminder (- x y) y)))
(define (car z)
	(define (iter count z)
		(if (= (reminder z 2) 0) 
			(iter (+ count 1) (/ z 2))
			count))
	(iter 0 z))
(define (cdr z)
	(define (iter count z)
		(if (= (reminder z 3) 0) 
			(iter (+ count 1) (/ z 3))
			count))
	(iter 0 z))


ex2-5

给出示例代码,要求给出one two 以及+

(define zero (lambda (f) (lambda (x) x)))
(define (1+ n)
	(lambda (f) (lambda (x) (f ((n f) x)))))

one two比较简单,只需将f 的参数变为f(x) f(f(x))即可

(这里的0是指对函数进行0次操作,即返回参数值,而不是0= =个人比较愚钝,纠结了好久)

加法的话就是之前那个+1的函数中(n f)有些难以理解

这里进行简单介绍,这里的n是一个函数,它的作用是将f作为参数,返回n次f的结果

(define one (lambda (f) (lambda (x) (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))
(define (+ a b)
	(lambda (f) ((a f) ((b f) x))))
;;Here n is a function that take f as an argument and return nth composition of f(same to a b)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值