;; Constructor (define (make-person name children) (list name children)) ;; Accessors (define (children tree) (cadr tree)) (define (name tree) (car tree)) ;; Jessica (define jessica (make-person '(Jessica Grey) (list (make-person '(Joseph Wetter) '())))) ;; Jason (define jason (make-person '(Jason Grey) (list (make-person '(Sean Grey) '()) (make-person '(Mary Grey) (list (make-person '(Fred Smith) '()) (make-person '(Jane Smith) '()))) (make-person '(Hannah Grey) '())))) ;; John (define john (make-person '(John Grey) (list (make-person '(Amy Grey) '()) jason jessica))) ;; Lucas (define lucas (make-person '(Lucas Grey) (list john (make-person '(Peter Grey) '())))) (define (grandchildren person) (reduce + (map (lambda (x) (count (children x))) (children person)))) (define (grandparent? person) (> (grandchildren person) 0)) (define (number-most-grandchildren person) (if (not (grandparent? person)) 0 (apply max (cons (grandchildren person) (map number-most-grandchildren (children person)))))) (define (most-grandchildren person) (define (helper person) (if (not (grandparent? person)) (list (name person) 0) (reduce (lambda (x y) (if (> (cadr x) (cadr y)) x y)) (cons (list (name person) (grandchildren person)) (map helper (children person)))))) (name (helper person))) ;; Change a person's name in a given person's family tree (define (replace-people oldname newname person) (make-person (if (equal? oldname (name person)) newname (name person)) (map (lambda (x) (replace-person oldname newname x)) (children person)))) ;; Remove a person's family from a given person's family tree (define (replace-family target person) (make-person (name person) (if (equal? target (name person)) '() (map (lambda (x) (replace-family target x)) (children person))))) ;; ;; Print helper ;; (define (print-family-tree person) (define (helper person depth) (display (n-spaces (* 3 depth))) (show (name person)) (for-each (lambda (x) (helper x (+ 1 depth))) (children person))) (helper person 0)) (define (n-spaces n) (if (= n 0) "" (word " " (n-spaces (- n 1)))))