0

我有一个形式为 ( (1 (8 3)) ( 2(4 5 7)) ( 3 ( 6 7))) 的 list1

而且我还有一个 list2 形式( 2 3 )

我想有一个列表,其中包含 list1 中每对中的所有第二个元素,其中第一个元素在 list2 中。

在我们的例子中,结果将是 (4 5 7 6 7)

我在想这样的事情,但我完全糊涂了!

  (define (returnlist l1 l2)
  (

   cond(( equal? (map car l1)) (car l2)) (  cdr(car l1)))
         (else  (returnlist  l1 (cdr l2)    )
   )


    ))
4

2 回答 2

0

此解决方案有几个步骤:

  1. 过滤其键所属的元素list2filter用于此)
  2. 获取每个键对应的列表(map会有用)
  3. 创建一个包含答案的列表(apply+append将节省一天)

这就是我的意思:

(define (returnlist l1 l2)
  (apply append                   ; step 3
         (map cadr                ; step 2
              (filter (lambda (e) ; step 1
                        (member (car e) l2))
                      l1))))

结果将如预期:

(define list1 '((1 (8 3)) (2(4 5 7)) (3 (6 7))))
(define list2 '(2 3))
(returnlist list1 list2)
=> '(4 5 7 6 7)
于 2013-11-13T20:40:23.223 回答
0

这是一个递归版本:

(define (returnlist l1 l2)
  (if (empty? l1)
      '()
      (let* ((c (car l1)) (c1 (car c)))
        (if (member c1 l2)
            (append (cadr c) (returnlist (cdr l1) l2))
            (returnlist (cdr l1) l2)))))

然后

(returnlist '((1 (8 3)) (2 (4 5 7)) (3 (6 7))) '(2 3))
=> '(4 5 7 6 7)
于 2013-11-13T20:47:30.053 回答