Racket 列表中的项目总和

Racket 列表中的项目总和,racket,Racket,我在Racket中处理简单的列表,我在做一个函数来求列表元素的和 但我想知道是否有更简单的方法来做到这一点 我做了这个功能: (define (mySum L) (if (empty? L) 0 (+ (first L) (mySum (rest L)))) ) 输出: (mySum '(1 2 3 4)) 10 我想知道是否有人知道更简单的方法。我解释自己,例如: 这是我做的另一个功能: (define (myAppend L1 L2) (if (empty? L1

我在Racket中处理简单的列表,我在做一个函数来求列表元素的和

但我想知道是否有更简单的方法来做到这一点

我做了这个功能

(define (mySum L)
  (if (empty? L) 0
      (+ (first L) (mySum (rest L))))
  )
输出:

(mySum '(1 2 3 4))
10
我想知道是否有人知道更简单的方法。我解释自己,例如: 这是我做的另一个功能:

(define (myAppend L1 L2)
  (if (empty? L1) L2
      (cons (car L1) (myAppend (cdr L1) L2)))
  )
但只需这样做,就可以更简单地实现此功能:

(define (myAppend L1 L2)
  (append L1 L2)
  )

我的问题是要知道是否有更简单的方法来计算列表中项目的总和。谢谢你,如果你只想要一个简短的节目

(define (mySum L)
  (apply + L))
它比较短。它是否“更简单”是一个解释问题:您编写它的方式似乎“更简单”,因为它完全是基于列表的结构定义的,而
(apply+L)
既依赖于半神奇的功能(
apply
),也依赖于
+
的半奇特行为(事实上,它需要可变数量的参数)它本身必须做一些与您已经编写的类似的事情


(顺便说一句,我也不会把你的
myAppend
例子说得更简单——第一个例子实际上定义了你想要的函数,而第二个例子只是指你想要的行为,而这又必须在别处定义。如果你是作为一个实用程序的一部分来做的,
(apply+L)
和使用内置的
append
当然是一个不错的选择,但如果这是出于教育目的,那么我认为这两个函数的初始版本都比较好。)

也可以使用
for/sum

(define (my+ L)
  (for/sum ((i L))
    i))

(my+ '(1 2 3 4))  ; => 10
“命名let”是一个类似于递归函数的版本,但可能更容易理解:

(define (myplus L)
  (let loop ((L L)
             (s 0))
    (cond
      [(empty? L) s]
      [else (loop (rest L) 
                  (+ s (first L)))] )))

这里的“cond”也可以替换为“if”,因为只有两个案例。关键字“else”也可以省略。

另一种方法是

(define (my-sum lst)
 (foldr + 0 lst))
这使用了内置函数foldr,而且非常简短。foldr使用函数(+)、基本大小写(0)和列表(lst)。我已经附加了一个指向foldr可视化表示的链接,以及一个非常好地解释它的链接

更多信息


:)

感谢您分享您的知识!这里也有一些关于折叠的有趣的讨论。如果你解释一下为什么以及如何用这段代码解决这个问题会更好。格式化代码也很好。那是代码的一部分吗?
(apply + '(elements_of_list))