简单的方案问题

时间:2011-05-21 19:03:00

标签: list scheme

如何从给定的数据库中找到列表? 数据库:

(10 math phys)

(11 math chem)

(13 bio chem)

(15 geo phys)

我想实现time,它会在列表中显示第一和第二个考试。

>(time ’10)

(list ‘math ‘phys)

>(time ’19)

empty

我想实现secondExams,它会返回第二次考试的时间。

>(secondExams ‘phys)

(list ‘10 ’15)

>(secondExams ‘chem)

(list ’11 ’13)

谢谢

1 个答案:

答案 0 :(得分:2)

首先,让我们澄清一下您的数据库格式。将其列为清单:

(define database
  '((10 math phys)
    (11 math chem)
    (13 bio chem)
    (15 geo phys)))

然后 time 只需递归地遍历列表,并将子列表的第一个元素与目标值进行比较。如果我们找不到匹配的值,我们将返回空列表。我们将在帮助程序中执行此操作,以匹配您正在寻求的功能。

(define time-ish
  (lambda (target lst)
    (cond ((null? lst) lst)
          ((eq? target (caar lst)) (cdar lst))
          (else
           (time-ish target (cdr lst))))))

(define (time lookin-for)
  (time-ish lookin-for database))

然后我们可以为secondExams做一些非常类似的事情。除了我们这次递归地建立一个匹配列表。

(define exam-helper
  (lambda (target lst)
    (cond ((null? lst) lst)
          ((eq? target (third (car lst))) (cons (first (car lst))
                                                (exam-helper target (cdr lst))))
          (else
           (exam-helper target (cdr lst))))))

(define (secondExams lookin-for)
  (exam-helper lookin-for database))

我没有测试过这段代码,但我很确定它对你有用。