使用参数在列表中搜索

时间:2014-02-17 21:31:29

标签: list functional-programming scheme racket

我试图实现一个给出参数和列表的函数,在列表中的第一个元素中找到该参数

像这样:

#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)

这个想法很简单,我有对元素和给定的数字。我需要查看对中的第一个元素(它们是否在列表中)是否以该数字开头

提前致谢

2 个答案:

答案 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