球拍折叠功能

时间:2015-11-08 01:41:22

标签: function scheme racket abstract fold

以下代码是来自课程的解决方案,而不是家庭作业。给定抽象折叠函数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)))

1 个答案:

答案 0 :(得分:0)

如果查看fold-unit功能,您会看到对c1c2的来电:

(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)。如果您认为这一点,您可以看到为什么这会返回一个部门的数量。