如何将球拍方案列表加在一起
How to add together a racket scheme list
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
您的 (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)
问题出在这部分:
(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
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
您的 (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)
问题出在这部分:
(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