返回平均赔率的Scheme函数

返回平均赔率的Scheme函数,scheme,racket,Scheme,Racket,我试图创建一个scheme函数,它将返回列表中奇数的平均值。比如说 (avg-odd 4 5 5 5 5 5) 我将返回5。这就是我目前所拥有的 (define avg-odd (lambda vals (if (odd? x) (/(apply + vals) (length vals))))) 运行时,它会显示缺少else表达式。请提供帮助。is的语法(如果是test expr,那么是expr else expr),因此所有表达式必须如下所示: (如果(奇数?

我试图创建一个scheme函数,它将返回列表中奇数的平均值。比如说

(avg-odd 4 5 5 5 5 5)
我将返回5。这就是我目前所拥有的

(define avg-odd
  (lambda vals
    (if (odd? x)
        (/(apply + vals) (length vals)))))
运行时,它会显示缺少else表达式。请提供帮助。

is的语法(如果是test expr,那么是expr else expr),因此所有表达式必须如下所示:
(如果(奇数?5)“奇数”“偶数”)
。 在您的示例中,缺少else expr部分。如果您需要condition而不需要else expr,请使用,它可以具有以下形式:
(当(奇数?5)“奇数”)

实际上,这里不需要它们。您需要过滤所有奇数,然后计算平均数。您可以使用内置功能:

或者编写自己的过滤函数:

(define filter-odd (lambda (lst)
                       (cond ((null? lst) lst)
                             ((odd? (car lst)) (cons (car lst)
                                                     (filter-odd (cdr lst))))
                             (else (filter-odd (cdr lst))))))

(define avg-odd (lambda vals
                  (let ((odd-vals (filter-odd vals)))
                    (if (null? odd-vals) 0
                        (/ (apply + odd-vals)
                           (length odd-vals))))))

(avg-odd 4 5 5 5 5 5)

if
需要一个“真”分支和一个“假”分支,而您只有一个“真”分支。
也没有
x
可以传递到
odd?
,并且
(/(应用+vals)(长度vals))
是整个列表的平均值

这个练习的目的是训练你思考“我昨天写了一个函数来计算一个列表的平均值,所以如果我有一个只有奇数的列表,我可以使用这个函数,今天可以做更少的工作”

如果遇到
过滤器
,则应使用以下方法:

(define (avg-odd ls) (avg (filter odd? ls)))

是否尝试添加else表达式以匹配if?
(define (avg-odd ls) (avg (filter odd? ls)))