对于"我们的发现是否"这是一个很好的纠正在格雷厄姆的OnLisp第23页勘误表?

时间:2014-08-12 09:32:38

标签: common-lisp on-lisp

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

1 个答案:

答案 0 :(得分:3)

没关系,它是尾递归的。

我建议进行以下更改:

  • 使用标准缩进(身体为2个空格)
  • 使用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)))))