【问题标题】:implementing a helper function实现辅助功能
【发布时间】:2012-10-09 09:23:51
【问题描述】:

过程 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)))])))

我是否在帮助程序或 find-last 过程中遗漏了什么? 它返回一个语法错误。

【问题讨论】:

    标签: scheme helper predicate


    【解决方案1】:

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

    我会推荐前者;假设(从名称上)find-last-helper 仅对 find-last 有用,它使外部环境保持清洁。

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

    【讨论】:

    • 我明白了,我明白这一点。我尝试了该解决方案,但无论出于何种原因,代码仍然无法正常工作。我应该尝试重写它吗?它现在返回一个不正确的参数计数。
    • 不知道你是如何重新编辑代码的,很难说。但是,另一个问题是:您确定“(等于?谓词?(car ls))”是对的吗?既然 predicate 是一个函数,你的意思不是 '(predicate?(car ls))' 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2016-06-03
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多