如何将球拍方案列表添加到一起

问题描述 投票:1回答:2

Racket Scheme的新功能,并尝试将已定义列表的内容添加到一起。我将单独添加列表,例如每个列表的总数,然后将所有列表的总数加在一起。

到目前为止,我所拥有的是已定义的列表以及我认为是列表总数的初始添加内容,但似乎没有任何内容可以汇总在一起。如何将此列表中的所有值以及所有列表单独添加到一起?

#lang racket
(define team '(("Emp1" (57 57 80 47 68 56 84 65))
               ("Emp2" (57 69 57 84 87 71 77 69 61 48))
               ("Emp3" (46 47 61 65 81 64 40 77 51 78))
               ("Emp4" (70 68 89 41))
               ("Emp5" (45 48 74 83 40 44 70 85 98 86))
               ))

(define (getEmpTotals team)
  (if (empty? team) 0
      (+ (first team)(getEmpTotals(rest team)))))

实施的功能

(getTeamTotal team)

期望的输出

(("Emp1" 514) ("Emp2" 680) ("Emp3" 610) ("Emp4" 268) ("Emp5" 673))

2745
list scheme racket addition
2个回答
3
投票

你的(first team)正在提取("Emp1" (57 57 80 47 68 56 84 65))列表,你不能使用+

#lang racket

(require rackunit)

;; A Team is a [Listof [list String [Listof Number]]]
;; or
;; A Team is a [Listof Emp]
;; An Emp is a [list String [Listof Number]]

(define team '(("Emp1" (57 57 80 47 68 56 84 65))
               ("Emp2" (57 69 57 84 87 71 77 69 61 48))
               ("Emp3" (46 47 61 65 81 64 40 77 51 78))
               ("Emp4" (70 68 89 41))
               ("Emp5" (45 48 74 83 40 44 70 85 98 86))))

;; [Listof Number] -> Number
;; sums every number in l
(define (lsum l)
  (apply + l))

;; a recursive version, if you want:
(define (lsum-rec l)
  (if (empty? l)
      0
      (+ (first l) (lsum-rec (rest l)))))


;; you can map lsum on the [Listof Number] part of the team
(define (emp-sum team)
  (map (λ (empl) (list (first empl) (lsum (second empl)))) team))

(check-equal? (emp-sum team)
              '(("Emp1" 514) ("Emp2" 680) ("Emp3" 610) ("Emp4" 268) ("Emp5" 673)))

(define (team-sum team)
  (lsum (map second (emp-sum team))))

(check-equal? (team-sum team)
              2745)

2
投票

问题出在这一部分:

(first team)

第一个团队是两个元素的列表,标识符和子列表,我们想要添加该子列表中的所有元素。这是如何做:

(define (getEmpTotals team)
  (if (empty? team)
      0
      (+ (apply + (first (rest (first team))))
         (getEmpTotals (rest team)))))

(first (rest (first team)))部分可以简化为(cadar team)。而(apply + ...)正在添加子列表中的所有元素。

作为另一种选择,我们可以使用更高阶的程序来编写更惯用的解决方案:

(define (getEmpTotals team)
  (foldl (λ (t acc) (+ (apply + (cadr t)) acc))
         0
         team))

无论哪种方式,它都按预期工作:

(getEmpTotals team)
=> 2745
© www.soinside.com 2019 - 2024. All rights reserved.