Paul Graham的'On Lisp' errata page州:
页。 23.如果没有元素匹配,my-find-if会无限递归。由Markus Triska抓住。
书中显示的功能定义是:
(defun our-find-if (fn lst)
(if (funcall fn (car lst))
(car lst)
(our-find-if fn (cdr lst))))
这是我可能很糟糕的解决方法:
(defun our-find-if (fn lst)
(if (funcall fn (car lst))
(car lst)
(if (cdr lst)
(our-find-if fn (cdr lst))
nil)))
这是对的吗?我的'our-find-if'版本仍然是尾递归吗? (我想是的......)
更好的替代品欢迎。
TIA
答案 0 :(得分:3)
没关系,它是尾递归的。
我建议进行以下更改:
cond
代替嵌套if
s predicate
用于返回布尔值endp
来测试列表的结尾更新:首先测试列表的结尾,感谢Paulo Madeira
它看起来像这样:
(defun our-find-if (predicate list)
(cond ((endp list)
nil)
((funcall predicate (car list))
(car list))
(t
(our-find-if predicate (cdr list)))))