两个关联列表方案

时间:2013-03-04 23:44:07

标签: scheme racket

假设我有两个返回关联列表的函数,其中一个给出每个人拥有的瓶子总量,另一个给出了他们获取它所需的天数。如何通过取两个列表的平均值来组合列表? 鉴于

(define (lookup k alst)
  (cond [(empty? alst)
         empty]
        [(equal? k (first (first alst)))
         (second (first alst))]
        [else 
         (lookup k (rest alst))]))

(define (put k v alst)
  (cond [(empty? alst)
         (list (list k v))]
        [(equal? k (first (first alst)))
         (cons (list k v) (rest alst))]
        [else
         (cons (first alst) 
               (put k v (rest alst)))]))

所以说函数(total-bottles lst)返回 '((bob 10) (tim 30) (sally 25))

(days-taken lst)会回来 '((bob 2) (tim 3) (sally 5))

我如何制作一个功能,将平均瓶装每日功能的列表组合起来,这些功能会返回平均每天收集的瓶子数量,以返回此结果? (average lst) '((bob 5) (tim 10) (sally 5))

2 个答案:

答案 0 :(得分:1)

如果按照您的建议,列表的顺序相同且包含完全相同的人,那么我建议您查看section 17.2 of HtDP,“同时处理两个列表”的案例2。它有很多这类问题。

如果这不是与课堂相关的问题,请告诉我。

答案 1 :(得分:1)

如果两个列表包含相同的人并且顺序相同,请按照@JhonClements的建议进行操作,并查看HtDP中的配方。为了给你一个想法,这里是解决方案的一般结构,填写空白:

(define (average l1 l2)
  (if <???>                   ; if one of the lists is null
      <???>                   ; return null
      (cons (list             ; else cons a new 2-element list, its first element
             <???>            ; is the name in the current position in either list
             (/ <???> <???>)) ; and calculate the average between current elements
            (average <???> <???>)))) ; finally, advance recursion over both lists

请注意,为了确定其中一个列表是否为空以选择该人的姓名,使用哪个列表并不重要 - 因为我们假设这些列表具有相同的长度和相同的人,在相同的位置。但是,要计算平均值,您需要考虑每个列表中的当前元素。完成后,不要忘记测试您的解决方案:

(average (total-bottles lst)
         (days-taken lst))

=> '((bob 5) (tim 10) (sally 5))