Scheme 如何从由三个字符串和整数组成的列表中找到整数值的平均值?

Scheme 如何从由三个字符串和整数组成的列表中找到整数值的平均值?,scheme,racket,Scheme,Racket,我需要一些家庭作业问题的帮助。问题是要编写一个非递归的averageAge函数,该函数将人员列表和字符串“employed”或“Underable”作为参数,并返回列表中具有给定就业状态的平均年龄人员 我已经编写了以下代码,但代码仅从列表中提取匹配值。sumList用于添加整数值之和: (define sumList (lambda(lst) (if (null? lst) 0 (+ (car lst)(sumList (cdr lst)))

我需要一些家庭作业问题的帮助。问题是要编写一个非递归的averageAge函数,该函数将人员列表和字符串“employed”或“Underable”作为参数,并返回列表中具有给定就业状态的平均年龄人员

我已经编写了以下代码,但代码仅从列表中提取匹配值。sumList用于添加整数值之和:

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