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)


發佈了35 篇原創文章 · 獲贊 1 · 訪問量 8303
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章