簡體   English   中英

如何將球拍方案列表加在一起

[英]How to add together a racket scheme list

球拍方案的新手,嘗試將已定義列表的內容加在一起。 我要分別將列表加在一起,例如每個單獨列表的總數,然后是所有列表的總數。

到目前為止,我所擁有的是已定義的列表,我認為是列表總數的初始加法,但似乎沒有任何東西加在一起。 如何將此列表中的所有值以及所有列表分別加在一起?

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM