我需要一些人可以帮我解释一下如何做到这一点
定义一个带有两个参数的函数,一个数字列表和一个数字(阈值)。它应返回一个与输入列表具有相同编号的新列表,但删除的所有元素都大于阈值编号。您不能将内置过滤器功能用作帮助程序 功能。您的实现必须是递归的。
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))
答案 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
,也许你应该用另一种方式编写代码。