Liitle Schemer第4页第81页rember *功能

时间:2016-04-12 09:41:09

标签: scheme

我正在学习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)))))))

哪个更适合每个人?

1 个答案:

答案 0 :(得分:2)

通常,不同程序实现相同功能并不罕见。但是,在你的例子中,这两个程序实现了不同的功能,所以我认为不能立即说“哪个是最好的”。

第二个程序(本书的程序)实现了在列表域中定义的函数,该域。因此,你不能给它一个原子,例如,因为它会产生错误。

另一方面,第一个(你的版本)可以应用于列表(在这种情况下具有与第二个相同的行为),但也可以应用于原子,这样你就可以做到,例如:

(rember* 'a 'a)  ; returns a
(rember* 'a 'b)  ; returns b

因此,应该查看函数的规范,并查看程序是否以一致的方式实现此规范。我会说第一个程序与函数的规范不完全一致(从第二个参数中删除一个元素),但这只是一个意见,因为该函数只在列表的域中定义良好。