Scheme 如何从由三个字符串和整数组成的列表中找到整数值的平均值?
我需要一些家庭作业问题的帮助。问题是要编写一个非递归的averageAge函数,该函数将人员列表和字符串“employed”或“Underable”作为参数,并返回列表中具有给定就业状态的平均年龄人员 我已经编写了以下代码,但代码仅从列表中提取匹配值。sumList用于添加整数值之和:Scheme 如何从由三个字符串和整数组成的列表中找到整数值的平均值?,scheme,racket,Scheme,Racket,我需要一些家庭作业问题的帮助。问题是要编写一个非递归的averageAge函数,该函数将人员列表和字符串“employed”或“Underable”作为参数,并返回列表中具有给定就业状态的平均年龄人员 我已经编写了以下代码,但代码仅从列表中提取匹配值。sumList用于添加整数值之和: (define sumList (lambda(lst) (if (null? lst) 0 (+ (car lst)(sumList (cdr lst)))
(define sumList
(lambda(lst)
(if (null? lst)
0
(+ (car lst)(sumList (cdr lst)))
)))
(define (averageAge lst s)
(filter (lambda(x) (equal? (caddr x) s)) lst))
(define lst '( (joe 21 "employed") ( ann 19 "unemployed") (sue 18 "employed" ) ))
代码从列表中提取以下值
>>(averageAge lst "employed")
>>'((joe 21 "employed") (sue 18 "employed"))
我不知道如何从这里获得以下输出。任何帮助都将不胜感激
>>(averageAge lst “employed”)
>>19.5
您可以通过将
sumList
过程与其他高阶过程组合在一起来找到解决方案。基本上,我们需要:
- 查找满足条件的元素列表-代码中的
过滤器
部分已经在执行此操作
- 调用
上一个结果中显示的年龄,sumList
用于提取年龄map
- 除以第一个结果的列表长度-假设为非空
- 我们应该将过滤后的列表存储在一个变量中,以避免重新计算它。我们可以使用
进行此操作let
- 我们需要处理过滤列表为空的情况(留给读者作为练习)
- 或者,将结果转换为小数(使用
)精确->不精确
(define (averageAge lst s)
(let ((filtered-by-status (filter (lambda (x) (equal? (caddr x) s)) lst)))
(/ (sumList (map cadr filtered-by-status))
(length filtered-by-status))))