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
作为函数调用。请记住,这不是“离题”,不是“真正的问题”。