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)