方案中列表或子列表中的搜索元素

时间:2013-10-18 00:11:19

标签: scheme

一个函数,它将获取一个项目和一个列表,并返回一个布尔值,表明该项目是否在列表或任何子列表中找到。

(define is-present?
  (lambda (item lis)
    (if (null? lis) #f
       (if (eqv? item (car lis))
       #t
       (is-present? (item (cdr lis)))))))

我能够在普通列表中搜索元素,但是当列表中有子列表时,它会失败。

4 个答案:

答案 0 :(得分:0)

如果您遇到子列表,则需要递归此子列表。

(define search
  (lambda (item lst)
    (cond ((null? lst)
           #f)
          ((pair? (car lst))
           (or (search item (car lst))
               (search item (cdr lst))))
          (else
            (or (eqv? item (car lst))
                (search item (cdr lst)))))))

答案 1 :(得分:0)

请尝试以下方法:

(define (present? item list)
    (cond ((or (not (list? list)) (null? list)) #f)
          ((let ((x (car list))) (or (eqv? item x) (present? item x))) #t)
          (else (present? item (cdr list)))))

这就是我们正在做的事情:

  1. 我们首先检查list是否实际上是一个列表。如果它不是列表,那么我们返回#f
  2. 然后我们检查list是否为空。如果它为空,则返回#f
  3. 接下来,我们会检查car的{​​{1}}是否为list。如果是,那么我们返回item
  4. 然后我们会检查#t的{​​{1}}是否包含car。如果是,则返回list
  5. 最后,如果没有其他内容检出,我们会返回item #t是否包含cdr
  6. list函数会检查itempresent?的成员还是item的子列表:

    list

    希望这有帮助。

答案 2 :(得分:0)

如果car的{​​{1}}本身就是一个列表,则需要采取特殊措施。您的代码缺少对该条件的检查。试试这个:

lis

答案 3 :(得分:0)

埃!那是我的功课问题。

这是我的答案:

(define present 
(lambda (x list)
(cond ((or (not (list? list)) (null? list)) #f)
      ((or (eqv? x (car list)) (present x (car list))) #t)
      (else (present x (cdr list))))))