1

Paul Graham 的“On Lisp”勘误页指出:

页。23. 如果没有元素匹配,our-find-if 将无限递归。被马库斯·特里斯卡抓住。

书中所示的函数定义为:

(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

4

1 回答 1

3

没关系,它是尾递归的。

不过,我会提出以下更改:

  • 使用标准缩进(主体 2 个空格)
  • 使用cond而不是嵌套ifs
  • 使用非缩写的变量名,以及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)))))
于 2014-08-12T12:47:39.960 回答