List 如何编写一个函数来检查项目是否在树中?

List 如何编写一个函数来检查项目是否在树中?,list,lisp,List,Lisp,我必须编写一个函数来检查项目是否在树中 例如: (defun find-in-tree (item tree) ...) (find-in-tree 2 '(1 (3 4 (2))) 2) ;; should give T (find-in-tree 2 '(1 (3 4))) ;; should give NIL 引述: 最后,考虑 REST,如果< /COD>,的递归版本,查找在树上以及在平面列表中工作的: (defun rfind-if (fn tree) (if (atom

我必须编写一个函数来检查项目是否在树中

例如:

(defun find-in-tree (item tree)
  ...)

(find-in-tree 2 '(1 (3 4 (2))) 2) ;; should give T
(find-in-tree 2 '(1 (3 4))) ;; should give NIL
引述:

<>最后,考虑<代码> REST,如果< /COD>,<代码>的递归版本,查找在树上以及在平面列表中工作的:

(defun rfind-if (fn tree)
  (if (atom tree)
      (and (funcall fn tree) tree)
      (or (rfind-if fn (car tree))
          (if (cdr tree) (rfind-if fn (cdr tree))))))
几个例子:

CL-USER> (find-if #'(lambda (x) (eq x 2)) '(1 (3 4 (2)))) ;; FIND-IF is the standard function
NIL
CL-USER> (rfind-if #'(lambda (x) (eq x 2)) '(1 (3 4 (2))))
2
CL-USER> (rfind-if #'(lambda (x) (eq x 2)) '((1 (2) 3) (3 4)))
2
CL-USER> (rfind-if #'(lambda (x) (eq x 2)) '((1 3) (3 4)))
NIL
CL-USER> (rfind-if (fint #'numberp #'oddp) '(2 (3 4) 5))
3
现在,一个递归版本的
find

(defun find/tree (item tree &optional (test #'eq))
  (rfind-if #'(lambda (el) (funcall test el item)) tree))
用法:

CL-USER> (find 2 '((1 (2) 3) (3 4))) ;; FIND is the standard function, again
NIL
CL-USER> (find/tree 2 '((1 (2) 3) (3 4)))
2
CL-USER> (find/tree "2" '((1 ("2") 3) (3 4)))
NIL
CL-USER> (find/tree "2" '((1 ("2") 3) (3 4)) #'equal)
"2"
您可以在和中找到有关列表、树、递归函数和递归搜索的更多信息



还有一个问题是这些函数是否是尾部递归的。这些问题在列出的书中也有讨论。

这似乎是家庭作业。如果是这样的话,它应该被贴上这样的标签。除非我们知道你已经尝试了什么,以及你不了解哪些具体问题,否则我们无能为力。这个问题是模糊的。示例表明正在进行树搜索(而不是列表搜索)。标准的
成员
函数将不会在嵌套的更深层次上找到
(2)
。语法
myMember(list,item)
不是Lisp;解析语法是家庭作业的一部分吗?另外,
(2)
是一个无效的表达式,试图将
2
作为函数调用。请记住,这不是“离题”,不是“真正的问题”。