IN Racket定义一个带两个参数的函数

时间:2017-07-11 05:23:33

标签: racket

我需要一些人可以帮我解释一下如何做到这一点

定义一个带有两个参数的函数,一个数字列表和一个数字(阈值)。它应返回一个与输入列表具有相同编号的新列表,但删除的所有元素都大于阈值编号。您不能将内置过滤器功能用作帮助程序 功能。您的实现必须是递归的。

INPUT:一个数字列表和一个原子序数。

输出:一个新的数字列表,仅包含原始列表中严格“小于”(<)的数字,即低于阈值数字。

Example:
> (upper-threshold '(3 6.2 7 2 9 5.3 1) 6)
'(3 2 5.3 1)
> (upper-threshold '(1 2 3 4 5) 4)
'(1 2 3)
> (upper-threshold '(4 8 5 6 7) 6.1)
'(4 5 6)
> (upper-threshold '(8 3 5 7) 2)
'()

这是我到目前为止但我收到错误

(define (upper-threshold pred lst)
  (cond [(empty? lst) empty]
        [(pred (first lst))
         (cons (first lst) (upper-threshold pred (rest lst)))]
        [else (upper-threshold pred (rest lst))]))

; (threshold (lambda (x) (> x 5)) '(1 6 7))

3 个答案:

答案 0 :(得分:2)

您的实施与您的作业没有相同的参数。

您需要将第一个元素与第二个参数进行比较的内容,以便将其视为较大或不相同,然后(cons (car lst) (upper-treshold (cdr lst) streshold))包含结果中的第一个元素,或(upper-treshold (cdr lst) treshold)不包含它。< / p>

(define (upper-threshold lst treshold)
  (cond [(empty? lst) empty]
        [(> (car lst) treshold)
         (cons (first lst) (upper-threshold (rest lst) treshold))]
        [else (upper-threshold (rest lst) treshold)]))

答案 1 :(得分:1)

您似乎已采用filter功能并将其重命名为upper-threshold。这两者是相关的,这是真的。我建议尝试使用设计方法从头开始构建upper-threshold

http://www.ccs.neu.edu/home/matthias/HtDP2e/

当您感到困惑时,请参阅您拥有的现有功能,包括您在此处的filter的定义。您的示例可能稍微难以理解,因为它使用lambda

答案 2 :(得分:1)

我不太了解你的代码。但是,你可能正在寻找这样的东西:

(define (upper-threshold lst theshold)
  (cond
    ((null? lst) '())
    ((< (car lst) theshold)
     (cons (car lst)
           (upper-threshold (cdr lst) theshold)))
    (else (upper-threshold (cdr lst) theshold))))

如果你的目的是实现标准函数filter,也许你应该用另一种方式编写代码。