我试图实现一个给出参数和列表的函数,在列表中的第一个元素中找到该参数
像这样:
#lang scheme
(define pairs
(list (cons 1 2) (cons 2 3) (cons 2 4) (cons 3 1) (cons 2 5) (cons 4 4)))
;This try only gets the first element, I need to runs o every pair on pairs
((lambda (lst arg)
(if (equal? (car (first lst)) arg) "DIFF" "EQ"))
pairs 2)
;This try below brings nok for every element, because Its not spliting the pairs
(define (arg) (lambda (x)2))
(map
(lambda (e)
(if (equal? arg (car e)) "ok" "nok"))
pairs)
这个想法很简单,我有对元素和给定的数字。我需要查看对中的第一个元素(它们是否在列表中)是否以该数字开头
提前致谢
答案 0 :(得分:2)
在Racket中,这很容易实现map
。只需这样做:
(define (find-pair lst arg)
(map (lambda (e)
(if (equal? (car e) arg) "ok" "nok"))
lst))
或者,你可以“手动”做同样的事情,基本上重新发明map
。请注意,在Scheme中,我们使用显式递归来实现循环:
(define (find-pair lst arg)
(cond ((null? lst) '())
((equal? (car (first lst)) arg)
(cons "ok" (find-pair (rest lst) arg)))
(else
(cons "nok" (find-pair (rest lst) arg)))))
无论哪种方式,它都按预期工作:
(find-pair pairs 2)
=> '("nok" "ok" "ok" "nok" "ok" "nok")
(find-pair pairs 7)
=> '("nok" "nok" "nok" "nok" "nok" "nok")
答案 1 :(得分:0)
在Scheme中,您通常应该使用递归思维方式来处理算法 - 尤其是在涉及列表时。在您的情况下,如果您在列表的car
中找到该元素,那么您就完成了;如果没有,那么你在列表的cdr
(其余)上遇到了同样的问题。当列表为空时,您没有找到结果。
这是一个解决方案:
(define (find pred list)
(and (not (null? list)) ; no list, #f result
(or (pred (car list)) ; pred on car, #t result
(find pred (cdr list))))) ; otherwise, recurse on cdr
如果参数的车辆是n,那么你的谓词函数'匹配是:
(define (predicate-if-car-is-n n)
(lambda (arg)
(eq? n (car arg))))
以上介绍了你的理解;确保你理解它 - 它返回一个使用n
的新函数。
将所有内容放在一起,举例说明:
> (find (predicate-if-car-is-n 2) '((1 . 2) (2 . 3) (4 . 5)))
#t
> (find (predicate-if-car-is-n 5) '((1 . 2) (2 . 3) (4 . 5)))
#f