球拍相交两个列表
Racket Intersect Two Lists
我试图在 Racket 上交叉两个列表,但以下代码不起作用:
(define (intersection a b)
(if (null? a)
'()
(if (contains (car a) b)
(cond (car a)(intersection (cdr a) b))
(intersection (cdr a) b))))
结果始终是列表 a 的第一项包含在列表 b 中,再加上列表 a 的其余部分。例如:
a = '(1 2 3 4 5 6)
b = '( 10 20 4 30 33)
会 return:
'(4 5 6)
我确定 contains 工作正常,所以错误一定是在我发布的代码中。谢谢!
cond
是一种特殊形式,是嵌套 if
的就地替代。在我看来,您并不打算检查 car
是否为真,因此 a
将始终是结果,所以我猜您实际想要使用的是 cons
:
(define (intersection a b)
(if (null? a)
'()
(if (contains (car a) b)
(cons (car a) (intersection (cdr a) b))
(intersection (cdr a) b))))
(define contains member) ; contains wasn't defined by I guess member will do
(intersection '(1 2 3 4 7) '(3 4 5 6)) ; ==> (3 4)
嘿,如果你这样做不是为了好玩,你可以使用 Racket 的 set-intersect 功能
(set-intersect '(1 2 3 4 7) '(3 4 5 6)) ; => '(4 3)
我试图在 Racket 上交叉两个列表,但以下代码不起作用:
(define (intersection a b)
(if (null? a)
'()
(if (contains (car a) b)
(cond (car a)(intersection (cdr a) b))
(intersection (cdr a) b))))
结果始终是列表 a 的第一项包含在列表 b 中,再加上列表 a 的其余部分。例如:
a = '(1 2 3 4 5 6)
b = '( 10 20 4 30 33)
会 return:
'(4 5 6)
我确定 contains 工作正常,所以错误一定是在我发布的代码中。谢谢!
cond
是一种特殊形式,是嵌套 if
的就地替代。在我看来,您并不打算检查 car
是否为真,因此 a
将始终是结果,所以我猜您实际想要使用的是 cons
:
(define (intersection a b)
(if (null? a)
'()
(if (contains (car a) b)
(cons (car a) (intersection (cdr a) b))
(intersection (cdr a) b))))
(define contains member) ; contains wasn't defined by I guess member will do
(intersection '(1 2 3 4 7) '(3 4 5 6)) ; ==> (3 4)
嘿,如果你这样做不是为了好玩,你可以使用 Racket 的 set-intersect 功能
(set-intersect '(1 2 3 4 7) '(3 4 5 6)) ; => '(4 3)