-1

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

(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))?

4

2 回答 2

1

如果按照您的建议,列表的顺序相同并且包含完全相同的人,那么我建议您查看HtDP 的第 17.2 节,“同时处理两个列表”的案例 2。它有一堆正是这种类型的问题。

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

于 2013-03-05T00:30:15.137 回答
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))
于 2013-03-05T01:02:01.870 回答