The Little Schemer 第 4 页 81 记住*功能
The Liitle Schemer 4th page81 rember* function
我正在学习 The Liitle Schemer 4th。
有时我有不同的解决方案。看得我一头雾水,看不懂书上的标准答案
例如,使用 rember*:
我的解决方案是:
(define rember*
(lambda (a l)
(cond
((null? l) '())
((atom? l) l)
((eq? a (car l)) (rember* a (cdr l)))
(else (cons (rember* a (car l)) (rember* a (cdr l)))))))
书中的解法:
(define rember*
(lambda (a l)
(cond
((null? l) '())
((atom? (car l))
(cond
((eq? (car l) a)
(rember* a (cdr l)))
(else (cons (car l)
(rember* a (car l))))))
(else (cons (rember* a (car l))
(rember* a (cdr l)))))))
哪个更好?
还有一个问题。
原始结构:
(define rember*
(lambda (a l)
(cond
((null? l) '())
((atom? (car l))
(cond
((eq? (car l) a)
(rember* a (cdr l)))
(else (cons (car l)
(rember* a (car l))))))
(else (cons (rember* a (car l))
(rember* a (cdr l)))))))
新结构:
(define rember*
(lambda (a l)
(cond
((null? l) '())
((atom? (car l)) (cond
((eq? (car l) a) (rember* a (cdr l)))
(else (cons (car l) (rember* a (cdr l))))))
(else (cons (rember* a (car l)) (rember* a (cdr l)))))))
哪个更适合大家?
一般来说,同一个功能由不同的程序实现的情况并不少见。然而,在你的例子中,这两个程序实现了不同的功能,所以我认为不能直接说“哪个最好”。
第二个程序(书中的程序)实现了在列表域上定义的函数,仅该域。所以,你不能给它一个原子,例如,因为它会产生错误。
另一方面,第一个(你的版本)可以应用于列表(在这种情况下与第二个具有相同的行为),但也可以应用于原子,这样你就可以做,例如:
(rember* 'a 'a) ; returns a
(rember* 'a 'b) ; returns b
因此,应该查看函数的规范,看看程序是否以一致的方式实现了该规范。我会说第一个程序与函数的规范不完全一致(从第二个参数中删除一个元素),但这只是一种意见,因为该函数仅在列表域上得到了很好的定义。
我正在学习 The Liitle Schemer 4th。
有时我有不同的解决方案。看得我一头雾水,看不懂书上的标准答案
例如,使用 rember*:
我的解决方案是:
(define rember*
(lambda (a l)
(cond
((null? l) '())
((atom? l) l)
((eq? a (car l)) (rember* a (cdr l)))
(else (cons (rember* a (car l)) (rember* a (cdr l)))))))
书中的解法:
(define rember*
(lambda (a l)
(cond
((null? l) '())
((atom? (car l))
(cond
((eq? (car l) a)
(rember* a (cdr l)))
(else (cons (car l)
(rember* a (car l))))))
(else (cons (rember* a (car l))
(rember* a (cdr l)))))))
哪个更好?
还有一个问题。
原始结构:
(define rember*
(lambda (a l)
(cond
((null? l) '())
((atom? (car l))
(cond
((eq? (car l) a)
(rember* a (cdr l)))
(else (cons (car l)
(rember* a (car l))))))
(else (cons (rember* a (car l))
(rember* a (cdr l)))))))
新结构:
(define rember*
(lambda (a l)
(cond
((null? l) '())
((atom? (car l)) (cond
((eq? (car l) a) (rember* a (cdr l)))
(else (cons (car l) (rember* a (cdr l))))))
(else (cons (rember* a (car l)) (rember* a (cdr l)))))))
哪个更适合大家?
一般来说,同一个功能由不同的程序实现的情况并不少见。然而,在你的例子中,这两个程序实现了不同的功能,所以我认为不能直接说“哪个最好”。
第二个程序(书中的程序)实现了在列表域上定义的函数,仅该域。所以,你不能给它一个原子,例如,因为它会产生错误。
另一方面,第一个(你的版本)可以应用于列表(在这种情况下与第二个具有相同的行为),但也可以应用于原子,这样你就可以做,例如:
(rember* 'a 'a) ; returns a
(rember* 'a 'b) ; returns b
因此,应该查看函数的规范,看看程序是否以一致的方式实现了该规范。我会说第一个程序与函数的规范不完全一致(从第二个参数中删除一个元素),但这只是一种意见,因为该函数仅在列表域上得到了很好的定义。