Racket 列表中的项目总和
我在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
(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))