给定一个类型为'('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-numbers
和sumlist
函数。
对于初学者来说,您的某些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