如何找到方案中混合符号(数字和字符)的列表的平均值?



给定一个类型为'('a 1 'b 2 'c 3(的列表,我想计算列表中数字的平均值。

这就是我到目前为止所做的:我编写了 3 个正常工作的函数,一个用于删除字符,另一个用于计算列表中数字的总和,另一个用于查找平均值。但我不知道如何将它们放在一起来解决我的问题。

;remove all non numbers from a list:
(define (all-numbers x)
(cond ((null? x) null)
((integer? (car x)) (cons (car x) (all-numbers (cdr x))))
(else (all-numbers (cdr x)))))
;sum the elements of the list
(define (sumlist lst)
(cond ((null? lst) 0)
(( + (car lst) (sumlist (cdr lst))))))
; find the mean of the list
(define (a_mean lst)
(cond ((null? lst) 0)
((/ (sumlist lst) (length lst)))))
(a_mean '(1 2 3))
;find the mean of a mixed list
(define (m_mean lst)
(cond ((null? lst) 0)
((/ (sumlist ((all-numbers lst)) (length (all-numbers lst)))))))
(m_mean '('a 1 'b 2 'c 3))

我在上面的代码中收到一个错误m_mean。请帮忙!谢谢。

奥斯卡·洛佩斯的回答应该可以解决你的问题。

我现在将提供一种更简洁的方法来解决同一问题:

(define (m-mean lst)
(define all-numbers (filter number? lst))  ; Filter out all the non-numbers.
(if (null? all-numbers)
0  ; The mean is 0 if there are no numbers.
(/ (apply + all-numbers) (length all-numbers))))  ; Calculate mean.

这样,您就不必显式定义all-numberssumlist函数。

对于初学者来说,您的某些cond表达式在最终条件中缺少else关键字 - 这是强制性的,就像您在all-numbers中所做的那样。此外,在m_mean中有几个不正确的括号;这应该可以修复错误:

(define (m_mean lst)
(cond ((null? lst) 0)
(else (/ (sumlist (all-numbers lst))
(length (all-numbers lst))))))

现在它按预期工作:

(m_mean '(a 1 b 2 c 3))
=> 2

相关内容

  • 没有找到相关文章

最新更新