『The Little Schemer』笔记

『The Little Schemer』笔记

Chap.5 全是星星!

原子acup,列表lat((coffee) cup ((tea) cup) (and (hick)) cup),定义一个函数rember*,这里加一个*会给人一种震惊的感觉。

(rember* a lat)将不论原子a出现在列表lat的哪个表达式中的哪个部分,都将被去除。即(rember* a lat)将得到((coffee) ((tea)) (and (hick)))

(define (rember* a l)
	(cond ((null? l) nil)
		((pair? (car l)) 
			(cons (rember* a (car l)) (rember* a (cdr l))))
		(else (if (eq? (car l) a) 
				(rember* a (cdr l))
				(cons (car l) (rember* a (cdr l))))))
)

Scheme十诫之第一诫(终极式):当对一个原子列表lat进行递归时,询问两个lat的问题:null? lat和else。当对一个数字n进行递归调用时,询问两个有关n的问题:zero?n 和else,当对一个S-表达式进行递归调用时,询问三个有关l的问题null? lat,atom? (car lat)和else。

再编写一个(insertR* new old l),这将l中每个单词old的右边插入一个new:

(define (insertR* new old l)
	(cond ((null? l) nil)
		((atom? (car l)) 
			(if (eq? (car l) old)
				(cons old (cons new (insertR* new old (cdr l)) ))
				(cons (car l) (insertR* new old (cdr l)))
				)
			)
		(else (cons (insertR* new old (car l)) (insertR* new old (cdr l))) )
	)
)

Scheme十诫之第四诫(终极式):在递归调用时,总是至少改变一个参数。当对一个原子列表lat进行递归调用时,使用cdr lat。当对数字n进行递归时,使用subl n,当对一个S-表达式l进行递归调用时,只要是null? l和atom? l都不为true则同时使用car l和sdr l。在递归时改变的参数,必须向着不断接近结束条件而改变,改变的参数必须在结束条件中得以测试。使用cdr l则用null? l测试是否结束,subl n则用zero? n判断结束

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注