(在Lisp中定义(平均....))

Eri*_*ver 7 lisp scheme racket

我只是在玩scheme/lisp,正在考虑如何正确地定义我自己的定义average.我不知道如何做一些我认为必需的事情.

  • 定义一个采用任意数量参数的过程
  • 算这些论点
  • 将参数列表传递给(+)将它们加在一起

有人有定义的例子average吗?我似乎不太了解LISP形成一个网络搜索,可以找回我正在寻找的结果.

Eli*_*lay 11

定义将是一个非常简单的单行,但不破坏它,你应该看看:

  • 一个"rest"参数 - 它(define (foo . xs) ...xs...)定义foo为一个函数,它接受任意数量的参数,并且它们可以作为列表使用,它将是值xs.

  • length 返回列表的长度.

  • apply 获取函数和值列表,并将函数应用于这些值.

当你得到它,你可以去更多:

  • 查看foldl函数以避免在可能非常大的列表上应用列表(这在参数列表的长度有限的某些实现中很重要,但在Racket中没有太大区别).

  • 请注意,Racket具有确切的exact->inexact有效性,您可以使用它来制作更高效的浮点版本.





剧透者是:

  • (define (average . ns) (/ (apply + ns) (length ns)))

  • 使它需要一个参数: (define (average n . ns) (/ (apply + n ns) (add1 (length ns))))

  • 用途foldl:(define (average n . ns) (/ (foldl + 0 (cons n ns)) (add1 (length ns))))

  • 使用浮点数: (define (average n . ns) (/ (foldl + 0.0 (cons n ns)) (add1 (length ns))))