计划清单的总和

时间:2018-02-03 19:05:37

标签: scheme racket

我是函数式编程和方案语言的初学者。

我找到了建立列表总和的方法:

(define (sum lst)
  (if (empty? lst)
      0
      (+ (car lst) (sum (cdr lst)))))

(sum (list 1 2 3))

我的问题是:有没有办法建立一个列表的总和而没有像sum这样的额外函数,只需使用" +"功能如下:

(+ 1 2 3)

3 个答案:

答案 0 :(得分:5)

您可以apply函数的参数列表。所以在这种情况下你可以:

> (apply + (list 1 2 3))
6

答案 1 :(得分:2)

MIT / Gnu-Scheme的引用说,+需要任意数量的参数。 我确信,这个标准。

一般来说:

(define (foo . args) ....)

的使用方式与(foo)(foo x)(foo x y)(foo x y z),....类似。在foo内,参数将为'()(x)(x y)(x y z)

参见SICP的练习2.20或MIT / Scheme Reference 9.2 chap 2.1

这意味着:

对于算术程序+*-/,您的过程不是必需的,因为它们是针对任意数量的参数定义的,包括零和一。 对于其他一些内置程序也是如此。 对于您自己的程序,您可以使用 dotted-tail 表示法。

您可以从GNU-Pages下载MIT / Scheme Reference。我认为它有助于Scheme的所有实现,因为标准的扩展是 描述。大多数部件都易于阅读。

答案 2 :(得分:1)

Common Lisp程序员应该关注 [http://www.gigamonkeys.com/book/functions.html]

在这里,您必须使用& rest而不是>。< (defun +(& rest numbers)...)

两种lisp方言都知道默认,可选和休息参数。