【发布时间】:2020-12-07 18:49:12
【问题描述】:
练习:开发函数average-age。它消耗一个家谱和当前年份。它产生了家谱中所有child 结构的平均年龄。
显然这个练习应该在一个函数中解决,但是累加器还没有被引入,所以我想知道如何在不使用表示中间结果的额外参数或创建辅助函数的情况下解决它。
这是我的解决方案:
(define CURRENT-YEAR 2020)
(define-struct no-parent [])
(define NP (make-no-parent))
(define-struct child [father mother name date eyes])
;; An FT (short for family tree) is one of:
;; - NP
;; - (make-child FT FT String Number String)
;; interp. a child in an ancestor family tree with father, mother, name, year of birth and color of eyes
;; Oldest generation:
(define Carl (make-child NP NP "Carl" 1926 "green"))
(define Bettina (make-child NP NP "Bettina" 1926 "green"))
;; Middle generation:
(define Adam (make-child Carl Bettina "Adam" 1950 "hazel"))
(define Dave (make-child Carl Bettina "Dave" 1955 "black"))
(define Eva (make-child Carl Bettina "Eva" 1965 "blue"))
(define Fred (make-child NP NP "Fred" 1966 "pink"))
;; Youngest generation:
(define Gustav (make-child Eva Fred "Gustav" 1988 "brown"))
;; Exercise 311
;; FT Number -> Number
;; Given ftree and current year, produce average age of all the child structures in the tree
;; ASSUME: the tree is not empty
(check-expect (average-age CURRENT-YEAR Carl)
(/ (- CURRENT-YEAR (child-date Carl)) 1))
(check-expect (average-age CURRENT-YEAR Eva)
(/ (+ (- CURRENT-YEAR (child-date Eva))
(- CURRENT-YEAR (child-date Carl))
(- CURRENT-YEAR (child-date Bettina)))
3))
(check-expect (average-age CURRENT-YEAR Gustav)
(/ (+ (- CURRENT-YEAR (child-date Gustav))
(- CURRENT-YEAR (child-date Eva))
(- CURRENT-YEAR (child-date Carl))
(- CURRENT-YEAR (child-date Bettina))
(- CURRENT-YEAR (child-date Fred)))
5))
;(define (average-age current-year ftree) 0)
(define (average-age current-year ftree)
(mean (child-ages current-year ftree)))
;; ListOfNumber -> Number
;; calculates statistical mean for the given list of numbers, produces 0 for empty list
(check-expect (mean empty) 0)
(check-expect (mean (list 100 200 600)) 300)
;(define (mean lon) 0)
(define (mean lon)
(cond [(empty? lon) 0]
[else (/ (foldl + 0 lon)
(length lon))]))
;; Number FT -> Number
;; produces list of ages in the ftree by subtracting everyone's age from current year
(check-expect (child-ages CURRENT-YEAR Carl) (list (- CURRENT-YEAR (child-date Carl))))
(check-expect (child-ages CURRENT-YEAR Eva) (list (- CURRENT-YEAR (child-date Eva))
(- CURRENT-YEAR (child-date Carl))
(- CURRENT-YEAR (child-date Bettina))))
;(define (child-ages current-year ftree) empty)
(define (child-ages current-year ftree)
(cond [(no-parent? ftree) empty]
[else (cons (- current-year (child-date ftree))
(append (child-ages current-year (child-father ftree))
(child-ages current-year (child-mother ftree))))]))
【问题讨论】:
-
我认为你必须被允许使用上一个练习中的
count-persons。有了这个就相当容易了。 -
你能用
local吗? -
@atharva-shukla 我可以使用
local,因为它在前面的章节中已经介绍过了,尽管它无助于避免创建辅助函数。 -
@tfb 这本书不会强迫你做什么,你可以做什么,你不能做什么。我只是想知道创建辅助函数是不可避免的还是我错过了在单个函数中完成它的一些可能性。
-
一个。多参数可以通过将新参数组合成一个在“正常”调用时完全出乎意料的新结构来模拟,并在每次调用时检查接收到的参数的结构,从而模拟,是的,一个辅助函数;湾。对于显式结构树,有 John McCarthy 的树旋转 gopher 技巧;但是这里隐含了树,所以你回到了选项 a。看来。
标签: functional-programming scheme binary-tree racket average