Liitle Schemer第4页81 rember*函数

Liitle Schemer第4页81 rember*函数,scheme,Scheme,我在研究Liitle Schemer 有时我有不同的解决办法。这让我很困惑,我不容易理解这本书的标准答案 例如,使用rember*: 我的解决办法是: (define rember* (lambda (a l) (cond ((null? l) '()) ((atom? l) l) ((eq? a (car l)) (rember* a (cdr l))) (else (cons (rember* a

我在研究Liitle Schemer

有时我有不同的解决办法。这让我很困惑,我不容易理解这本书的标准答案

例如,使用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

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

一般来说,相同的函数由不同的程序实现并不罕见。然而,在你的例子中,这两个程序实现了不同的功能,因此我认为不能马上说“哪一个是最好的”

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

另一方面,第一个(您的版本)可以应用于列表(在本例中具有与第二个相同的行为),但也可以应用于原子,因此您可以执行以下操作,例如:

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

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

第二个问题在SO中是一个趣味问题,与主题无关。两者都是根据lisp风格。在这种情况下,我会使用第二个,但如果代码变得更宽,我会恢复到第一个。在第一种情况下,我通常在多行的术语之间添加一个空行,以增加可读性。对于内部的
cond
,我会返回到
if
,因为它没有在
if
上使用
cond
的任何明显功能。好的,我知道了。第二个问题是关于SO的品味和离题。两者都是根据lisp风格。在这种情况下,我会使用第二个,但如果代码变得更宽,我会恢复到第一个。在第一种情况下,我通常在多行的术语之间添加一个空行,以增加可读性。对于内部的
cond
,我会返回到
if
,因为它没有在
if
上使用
cond
的任何明显功能。好的,我知道了。