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