以下代码是来自课程的解决方案,而不是家庭作业。给定抽象折叠函数fold-unit,你如何进入函数计数部门? n,x,z和y在count-departments函数中有什么作用?
(define TEXT-SIZE 20)
(define TEXT-COLOR "black")
(define KIND-COLOR "red")
;; University organization hierarchy
;; Kind is one of:
;; - "University"
;; - "Faculty"
;; - "Department"
;; - "Division"
;; interp. different kinds of academic unit
(define-struct unit (name kind subs))
;; Unit is (make-unit String Kind ListOfUnit)
;; interp. An academic unit with name, kind and a list of sub-units
;; ListOfUnit is one of:
;; - empty
;; - (cons Unit ListOfUnit)
;; interp. a list of academic units
(define BOTANY (make-unit "Botany" "Department" empty))
(define CS (make-unit "Computer Science" "Department" empty))
(define CHEMISTRY (make-unit "Chemistry" "Department" empty))
(define SCIENCE (make-unit "Science"
"Faculty"
(list BOTANY CHEMISTRY CS)))
(define ARTS (make-unit "Arts"
"Faculty"
(list (make-unit "Anthropology" "Department" empty)
(make-unit "Asian Studies" "Department" empty)
(make-unit "Geography" "Department" empty))))
(define USF
(make-unit "USF
"University"
(list ARTS SCIENCE)))
#;#;#;
(define (fn-for-kind k)
(cond [(string=? k "Faculty") (...)]
[(string=? k "University") (...)]
[(string=? k "Department") (...)]
[(string=? k "Division") (...)]))
(define (fn-for-unit u)
(... (unit-name u)
(fn-for-kind (unit-kind u))
(fn-for-lou (unit-subs u))))
(define (fn-for-lou lou)
(cond [(empty? lou) (...)]
[else
(... (fn-for-unit (first lou))
(fn-for-lou (rest lou)))]))
;
; PROBLEM 1:
;
; Design an abstract fold function for Unit.
;
;; (String X Z -> Y) (Y Z -> Z) X X X X Z -> Y
;; Abstract fold function for Unit.
(check-expect (fold-unit make-unit cons "Faculty" "University" "Department" "Division" empty USF) USF)
(define (fold-unit c1 c2 b1 b2 b3 b4 b5 u)
(local [(define (fn-for-kind k) ; -> X
(cond [(string=? k "Faculty") b1]
[(string=? k "University") b2]
[(string=? k "Department") b3]
[(string=? k "Division") b4]))
(define (fn-for-unit u) ; -> Y
(c1 (unit-name u)
(fn-for-kind (unit-kind u))
(fn-for-lou (unit-subs u))))
(define (fn-for-lou lou) ; -> Z
(cond [(empty? lou) b5]
[else
(c2 (fn-for-unit (first lou))
(fn-for-lou (rest lou)))]))]
(fn-for-unit u)))
;
; PROBLEM 2:
;
; Complete the following function design. Your function definition
; must use fold-unit.
;
; FOR SCRATCH WORK ONLY, USE A COPY OF THE FOLD FUNCTION.
;
;
; (define (fold-unit c1 c2 b1 b2 b3 b4 b5 u)
; (local [(define (fn-for-kind k) ; -> X
; (cond [(string=? k "Faculty") 0]
; [(string=? k "University") 0]
; [(string=? k "Department") 1]
; [(string=? k "Division") 0]))
;
; (define (fn-for-unit u) ; -> Y
; (+ (unit-name u)
; ;(fn-for-kind (unit-kind u))
; (fn-for-lou (unit-subs u))))
;
; (define (fn-for-lou lou) ; -> Z
; (cond [(empty? lou) 0]
; [else
; (+ (fn-for-unit (first lou))
; (fn-for-lou (rest lou)))]))]
;
; (fn-for-unit u)))
;; Unit -> Natural
;; count the number of departments in a unit
(check-expect (count-departments SCIENCE) 3)
(check-expect (count-departments USF) 6)
;(define (count-departments u) 0)
(define (count-departments u)
(local [(define (c1 n x z) (+ x z))
(define (c2 y z) (+ y z))]
(fold-unit c1 c2 0 0 1 0 0 u)))
答案 0 :(得分:0)
如果查看fold-unit
功能,您会看到对c1
和c2
的来电:
(c1 (unit-name u) ; n
(fn-for-kind (unit-kind u)) ; x
(fn-for-lou (unit-subs u))) ; z
(c2 (fn-for-unit (first lou)) ; y
(fn-for-lou (rest lou))) ; z
对于count-departments
,我们不关心单位名称,我们只是添加(在(+ x z)
和(+ y z)
)每个单位返回的数字,以便教师(b1
)为0,大学为0(b2
),部门为1(b3
),0为师(b4
),使用初始值0(b5
)。如果您认为这一点,您可以看到为什么这会返回一个部门的数量。