我正在使用Racket中的简单列表,我正在做一个函数来对列表的元素求和。
但我想知道是否有更简单的方法可以做到这一点。
我做了功能:
(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)
)
但是这个功能可以通过这样做更简单地完成:
x
我的问题是要知道是否有更简单的方法来处理列表中的项目总和。感谢
答案 0 :(得分:2)
如果你要的只是一个简短的节目,
(define (mySum L)
(apply + L))
更短。它是否“更简单”是一个解释问题:你写它的方式似乎“更简单”,因为它纯粹基于列表的结构来定义,而(apply + L)
依赖于两个神奇的函数(apply
)和+
的半幻想行为(事实上它需要可变数量的参数)本身必须做一些类似于你已经写过的事情。
(顺便说一下,我也不会简单地称你的myAppend
示例 - 第一个实际定义你想要的功能,而第二个只是引用你想要的行为,反过来又必须在其他地方定义。如果你这样做是实际程序的一部分,(apply + L)
并使用内置的append
肯定是这样的去,但如果这是出于教育目的,那么我认为这两个功能的初始版本都是优越的。)
答案 1 :(得分:2)
接近它的另一种方法是
net:
port: 27017
bindIp: 127.0.0.1,192.168.0.10
这使用内置函数foldr并且相当短。 Foldr使用函数(+),基本情况(0)和列表(lst)。我附上了一个指向foldr的可视化表示的链接,以及一个能够很好地解释它的链接。
更多信息Watch App terminates upon deactivation if WKAlert is being shown
答案 2 :(得分:1)
也可以使用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'如果'也可以替换为'这里,因为只有2个案例。关键字' else'也可以省略。