球拍相交两个列表

时间:2015-02-16 21:08:57

标签: list scheme racket

我正在尝试在Racket上交叉两个列表,但以下代码无效:

(define (intersection a b)
  (if (null? a)
    '()
    (if (contains (car a) b)
      (cond (car a)(intersection (cdr a) b))
      (intersection (cdr a) b))))

结果总是最终成为列表b中包含的列表a的第一项,加上列表a的其余部分。例如:

a = '(1 2 3 4 5 6)
b = '( 10 20 4 30 33)

会回来:

'(4 5 6)

我确信包含正常,因此错误必须在我发布的代码中。谢谢!

2 个答案:

答案 0 :(得分:4)

嘿,如果你不是为了好玩,你可以使用Racket的set-intersect功能

(set-intersect '(1 2 3 4 7) '(3 4 5 6)) ; => '(4 3)

答案 1 :(得分:0)

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)