:
最後に、rfind-if
、樹木だけでなく、フラットなリスト上で動作find-if
の再帰バージョン考える:
(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))
使用法:あなたはSICPにリスト、木、再帰関数と再帰検索についての詳細を調べることができます
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"
、 On LispおよびPAIP。
これらの機能がテール再帰的であるかどうかという疑問もあります。このような問題については、上の書籍でも議論されています。
出典
2012-04-21 17:55:46
JJJ
これは宿題のようです。もしそうなら、そのように分類されるべきです。 – CAbbott
私たちは、あなたが何をしようとしているのか、あなたが理解していない_特定の問題が何であるかを知らないと助けません。 – Tyler
この質問は曖昧です。この例では、ツリー検索(リスト検索ではない)が行われていることが示唆されています。標準の 'member'関数は、より深いネスティングレベルで'(2) 'を見つけることはありません。 'myMember(list、item)'の構文はLispではありません。その構文を解析する宿題の一部ですか?また '(2)'は関数として '2'を呼び出そうとする無効な式です。 – Kaz