方案:搜索列表和子列表中的元素

时间:2017-04-15 10:03:36

标签: scheme

我想编写一个接收列表的函数,并返回每个元素的列表。 例如: 得到 - (x 3 4 5 (x 4) 3 x (6)))并收到:(x (x) x ())

(define (lookForX lst)
  (cond
    ((null? lst) '())
    ((eq? (car lst) 'x) (cons (car lst) (lookForX (cdr lst))) )
    (else (lookForX (cdr lst)))))

我的代码结果:

(lookForX '(x 3 4 5 (x 4) 3 x (6))) 
-> (x x) 

我做错了什么?

1 个答案:

答案 0 :(得分:0)

在你的功能中,你只是在列表中寻找x作为元素而你没有做子列表:

(define (filter-x lst)
  (cond
    ((null? lst) '())
    ((eq? (car lst) 'x)
     (cons (car lst)
           (filter-x (cdr lst))))
    ((pair? (car lst))
     (cons (filter-x (car lst))
           (filter-x (cdr lst))))
    (else (filter-x (cdr lst)))))

(filter-x '(x 3 4 5 (x 4) 3 x (6)))
; ==> (x (x) x ())

注意我将其重命名为更像lisp。 Lisp代码通常不使用camelCase但是使用lisp-case。你可以做得更通用:

(define (filter-tree predicate? lst)
  (cond
    ((null? lst) '())
    ((predicate? (car lst))
     (cons (car lst)
           (filter-tree predicate? (cdr lst))))
    ((pair? (car lst))
     (cons (filter-tree predicate? (car lst))
           (filter-tree predicate? (cdr lst))))
    (else (filter-tree predicate? (cdr lst)))))

(define (filter-tree-x lst)
  (filter-tree (lambda (v) (eq? v 'x)) lst))

(filter-tree-x '(x 3 4 5 (x 4) 3 x (6)))
; ==> (x (x) x ())

(define (filter-tree-numbers lst)
  (filter-tree number? lst))

(filter-tree-numbers '(x 3 4 5 (x 4) 3 x (6)))
; ==> (3 4 5 (4) 3 (6))