列表球拍中的总和项目

时间:2017-01-06 18:28:49

标签: racket

我正在使用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

我的问题是要知道是否有更简单的方法来处理列表中的项目总和。感谢

3 个答案:

答案 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的可视化表示的链接,以及一个能够很好地解释它的链接。

link

更多信息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'也可以省略。