实现辅助功能

时间:2012-10-09 09:23:51

标签: scheme helper predicate

过程find-last采用1个参数和列表的谓词,并返回满足谓词的列表中最右边的元素。如果不存在此类元素,请返回#f

(define (find-last-helper ans)
  (if (predicate? ans)
      (add1 ans)))
(define find-last
  (lambda (predicate? ls)
    (cond 
      [(null? ls) #f]
       [(equal? predicate? (car ls)) car ls]
        [else(find-last-helper(find-last ls(cdr ls)))])))

我在帮手或找到最后一个程序中遗漏了什么? 它返回语法错误。

1 个答案:

答案 0 :(得分:1)

find-last-helper 无法看到

谓词?。解决这个问题的方法是在 find-last 的lambda块中移动 find-last-helper 的定义,或者在 find中添加一个额外的参数-last-helper ,以便谓词?可以传递给它。

我会推荐前者;假设(来自名称) find-last-helper 仅对 find-last 有用,它会使外部环境更加清洁。

注意:假设你修复了错误但保留了基本结构,你的函数将返回最左边的匹配 - 它找到的第一个匹配 - 而不是最右边的匹配。为了清楚地看到这一点,假设列表中最左边的项满足谓词并逐步执行代码;应该很清楚,第三个递归的 cond 行没有被执行。