Scheme 我对sicp练习2.54的解决方案正确吗?

Scheme 我对sicp练习2.54的解决方案正确吗?,scheme,sicp,Scheme,Sicp,我觉得这个练习很有趣。以下是我的解决方案: (define (my-equal? a b) (cond ((eq? a b) #t) ((and (pair? a) (pair? b)) (and (my-equal? (car a) (car b)) (my-equal? (cdr a) (cdr b)))) (else #f))) 是这样吗?我想知道(eq?ab)是否为真,(equal?ab)应该始终为真。我认为我们可以通过考虑其他数据

我觉得这个练习很有趣。以下是我的解决方案:

(define (my-equal? a b)
  (cond ((eq? a b) #t)
        ((and (pair? a) (pair? b))
         (and (my-equal? (car a) (car b)) (my-equal? (cdr a) (cdr b))))
        (else #f)))

是这样吗?我想知道(eq?ab)是否为真,(equal?ab)应该始终为真。

我认为我们可以通过考虑其他数据类型,递归测试正确/不正确列表中的元素,给出更准确的答案。这是我的照片:

(define (same-type? a b)
  (or (and (number? a) (number? b))
      (and (symbol? a) (symbol? b))
      (and (string? a) (string? b))
      (and (list? a) (list? b))
      (and (pair? a) (pair? b))))

(define (my-equal? a b)
  (cond ((not (same-type? a b)) #f)
        ((or (symbol? a) (null? a) (null? b))
         (eq? a b))
        ((list? a)
         (if (not (= (length a) (length b)))
             #f
             (and (my-equal? (car a) (car b))
                  (my-equal? (cdr a) (cdr b)))))
        ((pair? a)
         (and (my-equal? (car a) (car b))
              (my-equal? (cdr a) (cdr b))))
        ((string? a) (string=? a b))
        ((number? a) (= a b))))

关于你问题的最后一部分,我建议你仔细看看这个问题。

我明白了,但是为什么要比较类型呢?我认为
eq?
可以。我的意思是我想知道在这里使用
相同类型?
的好处。它会加速程序还是什么?@Zakilo我在比较类型,因为每种数据类型都有不同的相等比较方式。小心使用
eq?
,阅读结尾的链接…我明白了。此外,在
(define x 1)(define y x)
之后,我测试了
(eq?x y)
返回true,但是
(我的equal?x y)
得到了一个错误。你的解决方案仍然正确。谢谢。“我想知道(eq?ab)是不是真的,(equal?ab)应该总是真的。”是的,那是正确的。@leppie不一定,正如我的答案末尾的链接中所说的那样,@scarLópez:你能举一个例子,说明什么东西是
eq?
,但不是
相等?
?@scarLópez:我仍然会发现任何实现都会为@scarLópez返回false是奇怪的:规范说,如果
eqv?
是false,那么
eq?
也必须是false。如果您将其翻转过来(使用简单的布尔逻辑),这意味着如果
eq?
为真,
eqv?
不能为假。但是如果
eqv?
为真,则
eq?
可能为假。(计划很难!;p)